Android-DevicePolicyManager

DevicePolicyManager

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

  • Device Administration, 设备管理员

  • Device Owner, 设备所有者

  • Profile Owner, 配置文件所有者

移动设备管理中主要使用Android的DeviceAdmin和DeviceOwner两大模块功能。

  • DeviceAdmin(设备管理):弱管控

    移动设备管理中使用Google提供的DeviceAdmin设备管理功能,在Android在2.2版本中引进的。通过用户授权自己的应用设备管理权限后,可以在代码中修改很多系统设置,比如设置锁屏方式、恢复出厂设置、设置密码、强制清除密码,修改密码等操作。

  • DeviceOwner(设备所有者):强管控

    通过DeviceAdmin所做的功能很有限,所以需要用到DeviceOwner。“设备所有者”是一类特殊的设备管理员,具有在设备上创建和移除辅助用户以及配置全局设置的额外能力。之前申请的DeviceAdmin可以对设备进行一些修改,而当应用成为DeviceOwner后,可以拥有更多的能力,可以对其他应用进行限制。

Device Owner 概述 DeviceOwner 译为设备所有者,在Android5.0系统推出。DeviceOwner涵盖了DeviceAdmin用户的所有管理能力,也涵盖了ProfileOwner的所有管理能力,并且在这些基础上额外添加了一些管理权限,如重启设备、禁用状态栏等。Android提供的三种权限管理策略的能力大小依次为 DeviceAdmin < ProfileOwner < DeviceOwner。

Android系统只能设置一个DeviceOwner程序,并且该程序在设置为DeviceOwner后不能取消,应用不能卸载,唯一可以取消的途径是恢复出厂设置。并且,DeviceOwner应用和ProfileOwner也会产生冲突,系统只能有一个DeviceOwner应用或者ProfileOwner应用。

DeviceOwner 的设置和能力 要使一个应用成为DeviceOwner,首先这个程序必须是一个DeviceAdmin,按照DeviceAdmin的标准流程配置一个程序,回顾往期文章Android Device Administration 应用的能力。 将配置好的程序设置为DeviceOwner之前,不必刻意去激活DeviceAdmin,系统在设置DeviceOwner的过程中会自动先激活DeviceAdmin,这也是DeviceOwner拥有DeviceAdmin所有能力的原因。 第三方应用和系统应用都没有权限设置DeviceOwner,


设置权限

通过手机设置能够开启的权限为Device Administration-设备管理员权限,在手机设置的设备管理内可以关闭。其能力有限,只能做很少的事,比如锁屏。

如果想要获取更高的权限,则会麻烦一点,以下是使用USB的方式,会获得Device Owner-设备所有者权限,能做的事更多,开启成功后,在手机设置的设备管理内无法停用:

提示:以下指令以搭配小助手App为前提,如果使用自己的App,则需要将包名替换为自己应用的包名。

1、在手机设置-账户内退出所有账号,比如小米账号、谷歌账号等。

可以使用以下命令查看账户:主要看此方法

1
adb shell pm list users

使用以下命令退出账户:如 999 根据上面的命令查看更改。只保留0:机主名称可能不同,但数字为 0。

1
adb shell pm remove-user 999

还有此命令查看账户:

1
adb shell dumpsys account 

2、使用以下命令获取权限

1
adb shell dpm set-device-owner com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver

1
adb shell dpm set-profile-owner com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver

注意:只能使用一种命令,只可以获取一种权限,否则报错

1
java.lang.IllegalStateException: Trying to set the device owner, but the user already has a profile owner.

成功后会有类似以下信息:

1
2
Success: Device owner set to package ComponentInfo{com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver}
Active admin set to component {com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver}

1
Success: Active admin and profile owner set to {com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver} for user 0

使用以下命令移除权限:移除权限后,设置的功能会重置还原。

1
adb shell dpm remove-active-admin com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver

成功信息如下:

1
Success: Admin removed ComponentInfo{com.example.littlehelper/com.example.littlehelper.ui.main.todo.service.LockReceiver}

执行 adb 指令后提示:

  • 提示 “Not allowed to … already some accounts on the device”
    没有移除全部账号,请移除您手机上所有的账户,包括 Google 账号和系统自带的如小米账户、三星账户等
  • 提示 “Not allowed to … already some users on the device”
    没有移除全部用户,请确认已移除全部用户

开启权限成功提示:

  • 在 Redmi Note 8 和 vivo NEX 上测试:移除权限后,设置的功能会失效还原。(所以,如果遇到什么问题无法解决,最后可以选择移除权限还原)
  • vivo NEX 开启权限后,应用即无法卸载,不需要开启禁止本应用被卸载开关。
  • Redmi Note 8 开启权限后,应用也可以被卸载,如果不想被误删,可以手动开启禁止本应用被卸载开关。

Provisioning API

当设备已经被设置并在使用中时,应用无法使用 Provisioning API 进行设备初始化和配置。

Provisioning API 仅适用于初始化和配置新设备或在设备重置后的初始化和配置。


备注

参考资料

developers

developers

Hail

DeviceOwnerDemo

小黑屋

欢迎关注微信公众号:非也缘也