一,DeviceAdmin設備管理
在Android在2.2版本中引進的。通過用戶授權自己的應用設備管理權限后,可以在代碼中修改很多系統設置,比如設置鎖屏方式、恢復出廠設置、設置密碼、強制清除密碼,修改密碼等操作。
二,DeviceOwner設備所有者
“設備所有者”是一類特殊的設備管理員,具有在設備上創建和移除輔助用戶以及配置全局設置的額外能力。之前申請的DeviceAdmin可以對你的設備進行一些修改,而當你的應用成為DeviceOwner后,你就可以擁有更多的能力,可以對其他應用進行限制。
三,使用
- 在res/xml目錄下新建
device_admin.xml
文件;<?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> </uses-policies> </device-admin>
- 注冊一個廣播繼承
DeviceAdminReceiver
;class MyDeviceAdminReceiver : DeviceAdminReceiver() { override fun onEnabled(context: Context?, intent: Intent?) { super.onEnabled(context, intent) Log.e(">>>>>>>>>", "onEnabled") } override fun onReceive(context: Context?, intent: Intent?) { super.onReceive(context, intent) Log.e(">>>>>>>>>", "onReceive") } override fun onDisableRequested(context: Context?, intent: Intent?): CharSequence { //這里如果返回的字符串不為空,那么當用戶去設置里取消時,則會提示帶此文字的確定框 val strResult = "取消時便不能使用免root停用應用" Log.e(">>>>>>>>>", "onDisableRequested") return strResult } override fun onDisabled(context: Context?, intent: Intent?) { super.onDisabled(context, intent) Log.e(">>>>>>>>>", "onDisabled") } }
- 在清單文件里注冊廣播;
<receiver android:name=".MyDeviceAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin"/> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> <action android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED"/> <action android:name="android.app.action.DEVICE_ADMIN_DISABLED"/> </intent-filter> </receiver>
- 激活設備管理器
if (!devicePolicyManager.isAdminActive(comName)) { val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN) intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, comName) intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "激活此設備管理員后可免root停用應用") startActivityForResult(intent, 1) } else { Toast.makeText(this, "此App已激活設備管理器", Toast.LENGTH_SHORT).show() }
- 成為DeviceOwner
- 利用NFC功能在手機初始化的時候發送一個DeviceOwner應用到手機上。參考鏈接。(未驗證)
- 利用ADB命令。(已驗證)
$adb shell dpm set-device-owner com.sscience.deviceowner/.MyDeviceAdminReceiver
若出現如下類似錯誤:
則可嘗試到設置-賬號中退出所有賬戶,然后重新嘗試ADB設置。java.lang.IllegalStateException: Not allowed to set the device owner because there are already some accounts on the device
- 在已root設備上進行。(已驗證)
注意:不需要退出設備已登陸的賬號- 首先激活設備管理器;
- 然后在
/data/system/
目錄下創建一個device_owner.xml
文件:<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <device-owner package="com.sscience.deviceowner" />
- 最后重啟即可。
- 停用App
val isHidden: Boolean = devicePolicyManager.isApplicationHidden(comName, packageName) devicePolicyManager.setApplicationHidden(comName, packageName, !isHidden)
- 移除DeviceOwner
當一個app成為DeviceOwner后,這個app是不能被卸載,也無法在設置->安全中關閉其權限。要想DeviceOwner后還能卸載這個app,也就是退出DeviceOwner,有如下方法:devicePolicyManager.clearDeviceOwnerApp(packageName)
- 1,在
AndroidManifest.xml
中的<application/>
節點添加android:testOnly="true"
;
2,通過命令adb install -t examole.apk
安裝該app;
3,通過命令adb shell dpm set-device-owner com.example.sample/.MyDeviceAdminReceiver
成為DeviceOwner;
4,通過命令adb shell dpm remove-active-admin com.example.sample/.MyDeviceAdminReceive
退出DeviceOwner;