DevicePolicyManager,設(shè)備策略管理器。顧名思義,DevicePolicyManager為Android系統(tǒng)的管理提供了一套策略,有三種方案
- Device Administration, 設(shè)備管理員
- Profile Owner, 配置文件所有者
- Device Owner, 設(shè)備所有者
Device Admin
過用戶授權(quán)自己的應(yīng)用設(shè)備管理權(quán)限后,可以在代碼中修改一些系統(tǒng)設(shè)置,需要在應(yīng)用中配置一個xml,xml中聲明相應(yīng)的權(quán)限,這些權(quán)限基本代表了DeviceAdmin可以使用的能力
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<!-- 密碼長度限制 -->
<limit-password />
<!-- 監(jiān)控屏幕解鎖嘗試次數(shù) -->
<watch-login />
<!-- 更改鎖屏密碼 -->
<reset-password />
<!-- 鎖屏(可實現(xiàn)一鍵鎖屏功能) -->
<force-lock />
<!-- 清除所有數(shù)據(jù) -->>
<wipe-data />
<!-- 設(shè)置鎖屏密碼的有效期 -->
<expire-password />
<!-- 設(shè)置存儲設(shè)備加密 -->
<encrypted-storage />
<!-- 禁用相機 -->
<disable-camera />
</uses-policies>
</device-admin>
ProfileOwner
ProfileOwner 譯為配置文件所有者,在Android5.0系統(tǒng)推出。ProfileOwner涵蓋了所有DeviceAdmin用戶的管理能力。Google為了細化行業(yè)領(lǐng)域的管理而推出了這一組API,也被稱為Android for work,旨在讓用戶在體驗上可以輕松的兼顧生活和工作,可以將你的個人信息和工作信息等進行分類,隨時查看
具體功能如下
隱藏應(yīng)用,可停用制定應(yīng)用并且不再界面顯示,除非調(diào)用相應(yīng)API恢復(fù)可用,否則該應(yīng)用永遠無法運行??梢杂脕黹_發(fā)應(yīng)用黑白名單功能。
禁止卸載應(yīng)用,被設(shè)置為禁止卸載的應(yīng)用將成為受保護應(yīng)用,無法被用戶卸載,除非取消保護。
復(fù)用系統(tǒng)APP
修改系統(tǒng)設(shè)置
調(diào)節(jié)靜音
修改用戶圖標
修改權(quán)限申請的策略
限制指定應(yīng)用的某些功能
允許輔助服務(wù)
允許輸入法服務(wù)
禁止截圖
禁止藍牙訪問聯(lián)系人
DeviceOwner
DeviceOwner, 設(shè)備所有者,Android5.0引入。同樣的,DeviceOwner涵蓋了所有DeviceAdmin用戶的管理能力,是一類特殊的設(shè)備管理員,具有在設(shè)備上創(chuàng)建和移除輔助用戶以及配置全局設(shè)置的額外能力。DeviceOwner完善了行業(yè)用戶的MDM(Mobile Device Manager)行業(yè)管理能力,主要能力如下:
- 設(shè)置網(wǎng)絡(luò)時間同步, 設(shè)置后無法從Settings取消
- 用戶管理, 創(chuàng)建用戶、刪除用戶等
- 管理賬號系統(tǒng)
- 清除鎖屏
- 設(shè)置Http代理
- 禁止狀態(tài)欄
- 通知等待更新
- 禁用相機
- 隱藏應(yīng)用
- 禁止卸載應(yīng)用
- 復(fù)用系統(tǒng)APP
- 獲取wifi地址
- 重啟系統(tǒng)
Demo演示Device Admin
- 激活設(shè)備管理器
- 取消激活設(shè)備管理器
- 設(shè)置解鎖方式 不需要激活就可以運行
- 設(shè)置解鎖方式 需要激活設(shè)備管理器
- 立即鎖屏
- 設(shè)置5秒后鎖屏 充電狀態(tài)下不管用
- 清除數(shù)據(jù) 恢復(fù)出廠設(shè)置
- 修改鎖密碼(PIN)
- 禁用相機
開啟設(shè)備管理器流程
-
編寫廣播接收器DeviceReceiver繼承DeviceAdminReceiver
public class DeviceReceiver extends DeviceAdminReceiver { @Override public void onEnabled(Context context, Intent intent) { // 設(shè)備管理:可用 Toast.makeText(context, "設(shè)備管理:可用", Toast.LENGTH_SHORT).show(); } @Override public void onDisabled(final Context context, Intent intent) { // 設(shè)備管理:不可用 Toast.makeText(context, "設(shè)備管理:不可用", Toast.LENGTH_SHORT).show(); } }
-
AndroidManifest注冊廣播接收器
<!--設(shè)備管理 begin --> <receiver android:name=".DeviceReceiver" 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" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver> <!--設(shè)備管理 end -->
-
xml下添加文件device_admin.xml
<?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <!-- 限制密碼類型 --> <limit-password /> <!-- 監(jiān)控登錄嘗試 --> <watch-login /> <!-- 重置密碼 --> <reset-password /> <!--鎖屏 --> <force-lock /> <!-- 恢復(fù)出廠設(shè)置 --> <wipe-data /> <!--禁用相機--> <disable-camera /> <disable-keyguard-features /> <set-global-proxy /> <!-- 設(shè)置鎖屏密碼的有效期 --> <expire-password /> </uses-policies> </device-admin>
-
激活設(shè)備管理器
// 激活設(shè)備管理器 public void enableDeviceManager() { //判斷是否激活 如果沒有就啟動激活設(shè)備 if (!devicePolicyManager.isAdminActive(componentName)) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, mContext.getString(R.string.dm_extra_add_explanation)); mContext.startActivity(intent); } else { Toast.makeText(mContext, "設(shè)備已經(jīng)激活,請勿重復(fù)激活", Toast.LENGTH_SHORT).show(); } }
-
移除設(shè)備管理器
// 取消激活設(shè)備管理器 public void disableDeviceManager() { devicePolicyManager.removeActiveAdmin(componentName); }