我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android权限级别探索(三),设置 DeviceOwner及api收集

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android权限级别探索(三),设置 DeviceOwner及api收集

一、准备工作 配置DeviceAdmin

配置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}”

三、api收集(精华)

设置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 关注 私信 展开阅读全文
作者:炭烤葫芦娃


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android权限级别探索(三),设置 DeviceOwner及api收集

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android权限级别探索(三),设置 DeviceOwner及api收集

一、准备工作 配置DeviceAdmin 配置DeviceAdmin可参考 android权限级别探索(二),设备管理器开启和使用及常见api,创建DeviceReceiver继承DeviceAdminReceiver,并在AndroidM
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录