当前位置: 移动技术网 > 移动技术>移动开发>Android > Android设备管理器,DeviceAdmin应用设置(代码方式,无需跳转系统界面用户点击激活)

Android设备管理器,DeviceAdmin应用设置(代码方式,无需跳转系统界面用户点击激活)

2020年07月14日  | 移动技术网移动技术  | 我要评论

我们有时候会用到DeviceAdmin权限,一般来说,需要用户手动到设备管理器里面激活应用,也可以APP通过startActivity的方式跳转到激活页面,这两个都需要用户手动点击激活,其实DevicePolicyManager本身有提供setActiveAdmin这个方法设置设备管理器应用的,不过这个方法是隐藏方法并且需要system权限

下面提供一种代码方式直接激活设备管理器的方式

必要条件

1.系统签名

2.uid 设置成 android.uid.system

代码如下

  private void mRefSetActiveAdmin(ComponentName policyReceiver, boolean refreshing) {
        DevicePolicyManager dpm  = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE)
        Class<?> refDPM = dpm.getClass();
        try {
            Method[] methods = refDPM.getDeclaredMethods();
            Method refSetActiveAdmin  = null;
            for (Method method : methods) {
                if(method.getName().equals("setActiveAdmin")){
                    if(method.getParameterTypes().length == 2){
                        refSetActiveAdmin = method;//Tips 为什么要用遍历的方式获取,因为用普通的参数类型方式无法获取到,这个情况遇到很多次了,明明包含该方法但就是无法获取到,有大神可以解释一下么。
                        break;
                    }

                }
            }

            refSetActiveAdmin.setAccessible(true);
            refSetActiveAdmin.invoke(dpm, policyReceiver, refreshing);
        }  catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

使用方式

        ComponentName componentName = new ComponentName(this, DeviceReceiver.class);//DeviceReceiver是admin类继承了DeviceAdminReceiver
        mRefSetActiveAdmin(componentName, false);

以上就可以激活指定的设备管理器Admin

本文地址:https://blog.csdn.net/OneT1me/article/details/107319531

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网