配置DeviceAdmin可参考 android权限级别探索(二),设备管理器开启和使用及常见api,创建DeviceReceiver继承DeviceAdminReceiver,并在AndroidManifest中注册,完成两步即可。无需将应用勾选为设备管理器,获取到deviceowner权限后会自动勾选。
二、获取DeviceOwner权限Google没有提供类似获取设备管理器权限那样的api,所以个人设备的deviceowner权限一般是通过adb shell命令赋予的,而一些大公司是采用批量订购设备,定制room的方式获取DeviceOwner权限。
获取deviceowner的adb命令:
adb shell dpm set-device-owner com.example.myapplication/com.example.myapplication.DeviceReceiver
其中com.example.myapplication是我demo的包名。com.example.myapplication.DeviceReceiver是我继承DeviceAdminReceiver的广播接收者的类名。
一般设置成功,会返回
“Success: Device owner set to package com.example.myapplication
Active admin set to component {com.example.myapplication/com.example.myapplication.DeviceReceiver}”
设置decviceowner很简单,真正开发中难的是如何在种类繁多的api中找到自己想要的。
google提供了官方文档(点击查询google提供的所有api),但是其中包含了大量的无效的,过时的,不适用国内厂商设备的(尤其是华为)。以下列出api不保证所有机型可用。
以setCameraDisabled(boolean disable) 举例如何禁用相机:
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName componentName = new ComponentName(context, DeviceReceiver.class);
dpm.setCameraDisabled(componentName , true);
接口名 | 返回类型 | 功能 | 备注 |
---|---|---|---|
setCameraDisabled (ComponentName admin, boolean disabled) | void | 禁用相机 | 获取设备管理器就可以调用 |
isDeviceOwnerApp(String packageName) | boolean | 是否有deviceowner权限 | true 是 |
reboot (ComponentName admin) | void | 重启 | |
setPackagesSuspended (ComponentName admin, String[] packageNames, boolean suspended) | String[] | 暂停应用 | API >=24 可以找到应用图标,但应用不能使用 |
setApplicationHidden (ComponentName admin, String packageName, boolean hidden) | boolean | 隐藏应用 | 应用图标消失,且应用不可用 context.getPackageManager().getInstalledPackages (PackageManager.MATCH_UNINSTALLED_PACKAGES); 可查询所有应用包括Hidden |
isApplicationHidden (ComponentName admin, String packageName) | boolean | 应用是否隐藏 | |
setStatusBarDisabled (ComponentName admin, boolean disabled) | boolean | 禁用状态栏 | |
setScreenCaptureDisabled (ComponentName admin, boolean disabled) | void | 禁止截屏 | |
setAutoTimeRequired (ComponentName admin, boolean required) | void | 禁止修改时间 | false:禁止 |
setLockTaskPackages (ComponentName admin, String[] packages) | void | 锁定界面 | |
setAlwaysOnVpnPackage (ComponentName admin, String vpnPackage, boolean lockdownEnabled) | void | 设置始终连接vpn | 重启后会自动连接(自启动?),但vpn可以手动关闭 |
getWifiMacAddress (ComponentName admin) | string | wifi mac 地址 | 测试有几款android8.0无法获取 |
switchUser (ComponentName admin, UserHandle userHandle) | boolean | 切换用户 | |
removeUser (ComponentName admin, UserHandle userHandle) | boolean | 删除用户 | 详见 |
createAndManageUser (ComponentName admin, String name, ComponentName profileOwner, PersistableBundle adminExtras, int flags) | boolean | 创建用户 | |
setDeviceOwnerLockScreenInfo (ComponentName admin, CharSequence info) | boolean | 锁屏界面提示 | |
setPermissionGrantState (ComponentName admin, String packageName, String permission, int grantState) | boolean | 通过包名设置权限 | 好像不太好用 |
setPermissionPolicy (ComponentName admin, int policy) | void | 自动授予权限 | 好像不太好用 |
setUninstallBlocked (ComponentName admin, String packageName, boolean uninstallBlocked) | void | 防卸 | 实际上获得deviceowner就已经防卸载了。。。或许可以给其他应用用? |
setMasterVolumeMuted (ComponentName admin, boolean on) | void | 静音 | |
setPermittedInputMethods (ComponentName admin, List packageNames) | boolean | 输入法 | 设置后只有允许的输入法才能用 |
setBluetoothContactSharingDisabled (ComponentName admin,boolean disabled) | boolean | 蓝牙是否允许访问联系人 | |
setCrossProfileCallerIdDisabled (ComponentName admin, boolean disabled) | boolean | 禁用来电显示 | |
setRequiredStrongAuthTimeout (ComponentName admin, long timeoutMs) | boolean | 超时时间 | |
resetPassword (String password, int flags) | boolean | 设置密码 | |
resetPasswordWithToken (ComponentName admin, String password, byte[] token, int flags) | boolean | 设置密码 | 从描述看,从android7.0后这个方法比resetPassword的级别更高 |
wipeData (int flags, CharSequence reason) | void | 恢复出厂(慎用) | |
setMaximumTimeToLock (ComponentName admin, long timeMs) | void | 最大待机时间 | |
setSecureSetting (ComponentName admin, String setting, String value) | void | 设置安全属性 | 很多Settings.System.putInt(…)的命令可以用setSecureSetting 执行,但是实际效果感人,生不生效听天命 |
clearDeviceOwnerApp (String packageName) | void | 取消deviceowner权限 | google并不推荐使用这个方法, 因为之前的设置仍然会生效。推荐使用恢复出厂 |
clearApplicationUserData | void | 通过包名清除数据 | 等同于ActivityManager.clearApplicationUserData() |
clearProfileOwner (ComponentName admin) | void | 取消profileowner | |
removeActiveAdmin (ComponentName admin) | void | 取消设备管理器 | |
addUserRestriction (ComponentName admin, String key) | void | 添加用户限制 | key详见下表 |
clearUserRestriction(ComponentName admin, String key) | void | 清除用户限制 | key详见下表 |
isSetUserRestriction(ComponentName admin, String key) | void | 通过key查询用户是否限制 | key详见下表 |
getUserRestrictions(ComponentName admin) | Bundle | 查询用户限制 | key详见下表 |
addUserRestriction方法可以添加用户限制,例如禁止恢复出厂,禁止使用wifi等。下表列举了一些key,更详细可参考google文档DevicePolicyManager的addUserRestriction方法。
key | 功能 | 备注 |
---|---|---|
DISALLOW_MODIFY_ACCOUNTS | 禁止添加删除账户 | |
DISALLOW_CONFIG_WIFI | 禁用wifi | |
DISALLOW_CONFIG_LOCALE | 禁止用户更改设备语言 | |
DISALLOW_INSTALL_APPS | 禁止安装应用 | |
DISALLOW_UNINSTALL_APPS | 禁止卸载应用 | |
DISALLOW_SHARE_LOCATION | 禁止用户打开位置共享 | |
DISALLOW_AIRPLANE_MODE | 禁止使用飞行模式 | |
DISALLOW_CONFIG_BRIGHTNESS | 禁止用户配置亮度 | |
DISALLOW_CONFIG_SCREEN_TIMEOUT | 禁止用户更改屏幕关闭超时 | |
DISALLOW_INSTALL_UNKNOWN_SOURCES | 禁止用户启用允许安装来自未知源的应用程序的“未知源”设置 | |
DISALLOW_BLUETOOTH | 禁用蓝牙 | |
DISALLOW_INSTALL_UNKNOWN_SOURCES | 禁止用户配置蓝牙。不限制打开或关闭蓝牙 | |
DISALLOW_BLUETOOTH_SHARING | 禁止蓝牙共享 | |
DISALLOW_USB_FILE_TRANSFER | 禁止usb传输 | |
DISALLOW_REMOVE_USER | 该用户是否可以删除其他用户 | |
DISALLOW_DEBUGGING_FEATURES | 禁用adb调试 | |
DISALLOW_CONFIG_VPN | 禁用vpn | |
DISALLOW_CONFIG_LOCATION | 禁用定位gps | |
DISALLOW_CONFIG_LOCATION | 不允许配置日期、时间和时区 | |
DISALLOW_CONFIG_TETHERING | 禁止配置便携式热点 | |
DISALLOW_NETWORK_RESET | 禁止重置网络设置 | |
DISALLOW_FACTORY_RESET | 禁用恢复出厂 | |
DISALLOW_ADD_USER | 禁止添加用户 | |
ENSURE_VERIFY_APPS | 禁止用户禁用应用程序验证 | |
DISALLOW_CONFIG_CELL_BROADCASTS | 禁止用户配置单元广播 | |
DISALLOW_CONFIG_MOBILE_NETWORKS | 禁止用户配置移动网络 | |
DISALLOW_APPS_CONTROL | 禁止修改应用:卸载、禁用、清缓存、清数据、强制停止 | 看上去应用范围很广,是否生效还需测试 |
DISALLOW_MOUNT_PHYSICAL_MEDIA | 禁用外部媒体 例如SD卡等 | |
DISALLOW_UNMUTE_MICROPHONE | 麦克风静音 | |
DISALLOW_ADJUST_VOLUME | 静音 | |
DISALLOW_OUTGOING_CALLS | 禁止拨打电话(允许紧急呼叫) | |
DISALLOW_SMS | 不允许用户发送或接收短信 | |
DISALLOW_FUN | 不允许用户玩 | ?描述怪怪的,待测试实际效果 |
DISALLOW_CREATE_WINDOWS | 禁止弹窗 | 以下类型禁止 TYPE_TOAST TYPE_PHONE TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT TYPE_SYSTEM_ERROR TYPE_SYSTEM_OVERLAY TYPE_APPLICATION_OVERLAY |
DISALLOW_SYSTEM_ERROR_DIALOGS | 不显示崩溃或无响应的错误对话框 | |
DISALLOW_CROSS_PROFILE_COPY_PASTE | 禁止复制粘贴 | |
DISALLOW_OUTGOING_BEAM | 禁用nfc | |
DISALLOW_SET_WALLPAPER | 禁止设置墙纸 | |
DISALLOW_SAFE_BOOT | 禁用安全模式 | |
DISALLOW_DATA_ROAMING | 漫游时禁止使用流量 | |
DISALLOW_SET_USER_ICON | 禁止修改用户图标 | |
ALLOW_PARENT_PROFILE_APP_LINKING | 不允许通过web打开app | action Intent.ACTION_VIEW category Intent.CATEGORY_BROWSABLE |
DISALLOW_AUTOFILL | 不允许用户使用自动填充服务 | |
DISALLOW_CONTENT_CAPTURE | 不允许出于人工智能目的捕获用户屏幕的内容 | 国内没这个东西吧 |
DISALLOW_USER_SWITCH | 禁止切换用户 | |
DISALLOW_SHARE_INTO_MANAGED_PROFILE | 禁止主用户共享文件给其他用户 | profileowner可能会用到 |
DISALLOW_PRINTING | 禁止用户打印 | |
DISALLOW_CONFIG_PRIVATE_DNS | 禁止用户修改专用DNS | |
DISALLOW_CONFIG_TETHERING | 禁用wifi热点 | |
DISALLOW_USB_FILE_TRANSFER | 禁用usb传输 |
使用举例 DISALLOW_CONFIG_WIFI:
dpm.addUserRestriction(mAdminName, UserManager.DISALLOW_CONFIG_WIFI);
炭烤葫芦娃
原创文章 8获赞 3访问量 1867
关注
私信
展开阅读全文
作者:炭烤葫芦娃