Android设备管理器,DeviceAdmin应用设置(代码方式,无需跳转系统界面用户点击激活)
程序员文章站
2022-05-05 08:34:22
我们有时候会用到DeviceAdmin权限,一般来说,需要用户手动到设备管理器里面激活应用,也可以APP通过startActivity的方式跳转到激活页面,这两个都需要用户手动点击激活,其实DevicePolicyManager本身有提供setActiveAdmin这个方法设置设备管理器应用的,不过这个方法是隐藏方法,并且需要system权限下面提供一种代码方式直接激活设备管理器的方式必要条件1.系统签名2.uid设置成android.uid.system代码如下 priva.....
我们有时候会用到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
上一篇: 小鹿茶“单飞” 瑞幸的“以小博大”之道