Android 提供了三种设备管理方案:DeviceAdmin(设备管理员)、ProfileOwner(配置文件所有者) 和 DeviceOwner(设备所有者),这三种设备管理方案的权限大小分别为:DeviceAdmin < ProfileOwner < DeviceOwner。应用需要最大的授权才能成为DeviceOwner,DeviceOwner具有设备的最高权限。
开启DeviceAdmin
1.Manifest中注册广播
<receiver
android:name=".SpeedFragment$VPNReceiver"
android:description="@string/sample_device_admin_description"
android:label="@string/sample_device_admin"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
2.基本配置(device_admin_sample)
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
<uses-policies>
<!-- 设置密码规则 -->
<limit-password />
<!-- 监视屏幕解锁尝试次数 -->
<watch-login />
<!-- 更改解锁密码 -->
<reset-password />
<!-- 锁定屏幕 -->
<force-lock />
<!-- 清除数据,恢复出厂模式,在不发出警告的情况下 -->
<wipe-data />
<!-- 锁屏密码有效期 -->
<expire-password />
<!-- 对存储的应用数据加密 -->
<encrypted-storage />
<!-- 禁用锁屏信息 -->
<disable-keyguard-features/>
<!-- 禁用摄像头 -->
<disable-camera />
</uses-policies>
</device-admin>
3.注册一个自定义广播接收器继承自DeviceAdminReceiver
class AdminReceiver : DeviceAdminReceiver() {
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
LogUtils.d("TAG_ADMIN", "onReceive: ${intent.toString()}")
}
override fun onEnabled(context: Context, intent: Intent) {
super.onEnabled(context, intent)
LogUtils.d("TAG_ADMIN", "激活了")
}
override fun onDisabled(context: Context, intent: Intent) {
super.onDisabled(context, intent)
LogUtils.d("TAG_ADMIN", "取消激活了")
}
}
4.激活DeviceAdmin
val devicePolicyManager =
context?.getSystemService(Context.DEVICE_POLICY_SERVICE) as? DevicePolicyManager
val componentName = ComponentName(context!!, AdminReceiver::class.java)
val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)
intent.putExtra(
DevicePolicyManager.EXTRA_DEVICE_ADMIN,
ComponentName(context!!, VPNReceiver::class.java)
)
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Device Admin")
startActivity(intent)