DevicePolicyManager,设备策略管理器。顾名思义,DevicePolicyManager为Android系统的管理提供了一套策略,有三种方案

  • Device Administration, 设备管理员
  • Profile Owner, 配置文件所有者
  • Device Owner, 设备所有者

三者的关系由浅入深提供设备管理的方法

Device Admin

过用户授权自己的应用设备管理权限后,可以在代码中修改一些系统设置,需要在应用中配置一个xml,xml中声明相应的权限,这些权限基本代表了DeviceAdmin可以使用的能力

具体功能如下:

  • 删除所有数据
  • 更改屏幕锁定
  • 设置密码规则
  • 监视屏幕解锁尝试次数
  • 锁定屏幕
  • 设置屏幕锁定密码的有效期
  • 设定存储设备加密
  • 停用相机

ProfileOwner

ProfileOwner 译为配置文件所有者,在Android5.0系统推出。ProfileOwner涵盖了所有DeviceAdmin用户的管理能力。Google为了细化行业领域的管理而推出了这一组API,也被称为Android for work,旨在让用户在体验上可以轻松的兼顾生活和工作,可以将你的个人信息和工作信息等进行分类,随时查看

具体功能如下

  • 隐藏应用,可停用制定应用并且不再界面显示,除非调用相应API恢复可用,否则该应用永远无法运行。可以用来开发应用黑白名单功能。

  • 禁止卸载应用,被设置为禁止卸载的应用将成为受保护应用,无法被用户卸载,除非取消保护。

  • 复用系统APP

  • 修改系统设置

  • 调节静音

  • 修改用户图标

  • 修改权限申请的策略

  • 限制指定应用的某些功能

  • 允许辅助服务

  • 允许输入法服务

  • 禁止截图

  • 禁止蓝牙访问联系人

DeviceOwner

DeviceOwner, 设备所有者,Android5.0引入。同样的,DeviceOwner涵盖了所有DeviceAdmin用户的管理能力,是一类特殊的设备管理员,具有在设备上创建和移除辅助用户以及配置全局设置的额外能力。DeviceOwner完善了行业用户的**MDM(Mobile Device Manager)**行业管理能力,主要能力如下:

  • 设置网络时间同步, 设置后无法从Settings取消
  • 用户管理, 创建用户、删除用户等
  • 管理账号系统
  • 清除锁屏
  • 设置Http代理
  • 禁止状态栏
  • 通知等待更新
  • 禁用相机
  • 隐藏应用
  • 禁止卸载应用
  • 复用系统APP
  • 获取wifi地址
  • 重启系统

2. Demo演示Device Admin

  • 激活设备管理器
  • 取消激活设备管理器
  • 设置解锁方式 不需要激活就可以运行
  • 设置解锁方式 需要激活设备管理器
  • 立即锁屏
  • 设置5秒后锁屏 充电状态下不管用
  • 清除数据 恢复出厂设置
  • 修改锁密码(PIN)
  • 禁用相机

3. 开启设备管理器流程

  1. 编写广播接收器DeviceReceiver继承DeviceAdminReceiver

    public class DeviceReceiver extends DeviceAdminReceiver {    @Override    public void onEnabled(Context context, Intent intent) {        // 设备管理:可用        Toast.makeText(context, "设备管理:可用", Toast.LENGTH_SHORT).show();    }@Overridepublic void onDisabled(final Context context, Intent intent) {    // 设备管理:不可用    Toast.makeText(context, "设备管理:不可用", Toast.LENGTH_SHORT).show(); }}
  2. AndroidManifest注册广播接收器

                 <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>        
  3. 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 />                <watch-login />                <reset-password />                <force-lock />                <wipe-data />                <disable-camera />                <disable-keyguard-features />        <set-global-proxy />                <expire-password />    uses-policies>device-admin>
  4. 激活设备管理器

       // 激活设备管理器    public void enableDeviceManager() {        //判断是否激活  如果没有就启动激活设备        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, "设备已经激活,请勿重复激活", Toast.LENGTH_SHORT).show();        }    }
  5. 移除设备管理器

       // 取消激活设备管理器    public void disableDeviceManager() {        devicePolicyManager.removeActiveAdmin(componentName);    }

4. 设置锁屏策略

PASSWORD_QUALITY_ALPHABETIC    // 用户输入的密码必须要有字母(或者其他字符)\nPASSWORD_QUALITY_ALPHANUMERIC  // 用户输入的密码必须要有字母和数字。\nPASSWORD_QUALITY_NUMERIC       // 用户输入的密码必须要有数字\nPASSWORD_QUALITY_SOMETHING     // 由设计人员决定的。\nPASSWORD_QUALITY_UNSPECIFIED   // 对密码没有要求。\n
 // 设置解锁方式 需要激活设备管理器(配置策略)    public void setLockMethod() {        if (devicePolicyManager.isAdminActive(componentName)) {            Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);            devicePolicyManager.setPasswordQuality(componentName,                    DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);            mContext.startActivity(intent);        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();        }    }

5. 立即锁屏

   //立刻锁屏    public void lockNow() {        if (devicePolicyManager.isAdminActive(componentName)) {            devicePolicyManager.lockNow();        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();        }    }

6. 设置一段时间后锁屏

  // 设置多长时间后锁屏    public void lockByTime(long time) {        if (devicePolicyManager.isAdminActive(componentName)) {            devicePolicyManager.setMaximumTimeToLock(componentName, time);        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();        }    }

7. 恢复出厂设置(谨慎操作)

   // 恢复出厂设置    public void wipeData() {        if (devicePolicyManager.isAdminActive(componentName)) {            devicePolicyManager.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();        }    }

8. 禁用相机

  // 禁用相机    public void disableCamera(boolean disabled) {        if (devicePolicyManager.isAdminActive(componentName)) {            devicePolicyManager.setCameraDisabled(componentName, disabled);        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT)                    .show();        }    }

9. 重置密码

   // 重置密码    public void resetPassword(String password) {        if (devicePolicyManager.isAdminActive(componentName)) {            devicePolicyManager.resetPassword(password,                    DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();        }    }

10.设定存储设备加密

这个东西,我一直不知道有什么用,有谁知道可以说下

 // 加密存储    public int encryptedStorage(boolean isEncrypte) {        if (devicePolicyManager.isAdminActive(componentName)) {            int result = devicePolicyManager.setStorageEncryption(componentName, isEncrypte);            Log.d(TAG, "encryptedStorage:result->" + result);            return result;        } else {            Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();        }        return -1;    }

详细代码

https://github.com/ddssingsong/DevicePolicyManager

更多相关文章

  1. android 3D系列之光效篇
  2. android:三种菜单(Menu)的设置
  3. Android入门笔记 - 网络通信 - HttpClient
  4. 模仿墨迹天气设置界面布局
  5. android style用法
  6. Android(安卓)图层引导帮助界面制作
  7. android Application Project目录结构
  8. Android开发21——隐式意图
  9. 弹窗之三:自定义Dialog

随机推荐

  1. android快速实现沉浸式
  2. Android依赖注入:Google Guice on Android
  3. Android Studio Intent 页面切换崩溃解决
  4. [ZT] Android(安卓)开发源码分享
  5. Android Recovery Ui 分析
  6. 如何让Android UI设计性能更高效
  7. Android Studio怎么新建Android公共库模
  8. android绘图常用方法归纳
  9. Android 显示网络图片
  10. Android(安卓)实现获取双卡中的联系人