Android提供了三种设备管理方案,Device Administration(设备管理员), ProfileOwner(配置文件所有者)和 DeviceOwner(设备所有者)。这三种管理方案对应三种等级的管理权限,相对的,等级越高所拥有的管理权限越高,面临的风险也对大,所以,要将一个应用设置成为这些管理设备,也需要不同的权限等级。
1: 设置 Device Administration
要设置一个DeviceAdmin 所需要权限相对来说是最小的,Android系统提供了一种方案:
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mComponentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "提示文字");
startActivityForResult(intent, 1);
该方法将激活DeviceAdmin的动作委托给系统Settings,有界面提示用户是否激活/停用/卸载一个设备管理应用。这种方案其实是一种动态权限,由用户决定是否启用设备管理。在特殊行业中,有些操作不应该让用户决定,由管理平台在后台一键设置。
2: 设置 ProfileOwner
system进程的系统应用,有设置ProfileOwner程序的能力,不细说了。
3:设置 DeviceOwner
DeviceOwner可以使一个第三方应用程序拥有系统最高管理权限,面临的风险也是最大的。 要设置一个DeviceOwner程序, 需要很高的权限,系统提供两种方式:
adb shell
adb shell dpm set-device-owner 1 / 2
1:项目包名
2:DeviceReceiver的包名.DeviceReceiver
比如:
adb shell dpm set-device-owner com.abc.mdm / com.abc.mdm.model.receiver.DeviceReceiver
DeviceReceiver又是什么呢?
DeviceReceiver是一个继承自DeviceAdminReceiver的Receiver用于控制静默安装,关闭摄像头等功能。
例如:
DevicePolicyManager mDPM =(DevicePolicyManager)GlobalApp.getContext().getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName mCN = new ComponentName(GlobalApp.getInstance().getApplicationContext(), DeviceReceiver.class);
if(mDPM.isAdminActive(mCN)){
mDPM.setCameraDisabled(mCN, true);
}
这种方式我验证过是没有问题的,还有一种NFC的方式就不介绍了。
android10.0回收了DeviceAdmin控制摄像头的权限,提示:java.lang.SecurityException: Admin ComponentInfo{com.gsc.mdm/com.gsc.mdm.model.receiver.DeviceReceiver} is not a device
owner or profile owner, so may not use policy: disable-camera
只有设置了mdm为DeviceOwner,才可以继续控制摄像头的启用,禁用,这是我的一点总结,希望帮助到更多的人。
网友评论