安卓手机APP开发___设备管理概述

祗疼妳一个  金牌会员 | 2024-6-22 05:58:17 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 512|帖子 512|积分 1536

安卓手机APP开发___设备管理概述
目次
概述
无头设备全部者模式
Device Administration API 概览
工作机制是怎样的?
政策
其他功能
示例应用
开发设备管理应用
创建清单
实当代码
启用应用
管理政策
设置密码政策
为设备设置密码
设置密码质量
设置密码内容要求
设置密码最小长度
设置错误密码实行次数上限
设置密码逾期超时时间
根据历史记录限定密码
设置设备锁定
实行数据清除
停用相机
存储加密


概述

设备管理弃用。从 Android 9(API 级别 28)开始,设备管理员
调用某些管理员政策时会被标记为已废弃。我们建议您立即着手
准备应对此项变更。要了解详情并查察迁移选项,请参阅 设备管理弃用。
Android 通过提供 Android Device Administration API 来支持企
业应用。Device Administration API 在体系级别提供设备管理功能。
借助这些 API,您可以创建在企业设置中有效的安全感知应用,在企业
环境中,IT 专业人员须要对员工设备举行丰富的控制。例如,内置的
Android 电子邮件应用使用这些 API 改进了对 Exchange 的支持。
通过“电子邮件”应用,Exchange 管理员可以跨设备逼迫实行密码政策,
包括字母数字密码或数字 PIN 码。管理员还可以远程清除(即规复出厂默认设置)
丢失或被盗手机上的数据。Exchange 用户可以同步他们的电子邮件和日历数据。
本文档适用于想要为 Android 设备开发企业办理方案的开发者。
本文讨论了 Device Administration API 提供的各种功能,这些
功能旨在为搭载 Android 的员工设备提供更强盛的安全保护。
注意:如需了解怎样为 Android for Work 部署构建工作政策控制器,
请参阅构建设备政策控制器。
无头设备全部者模式

Android 14(API 级别 34)引入了无头体系用户模式(在此类设备上,UserManager.
isHeadlessSystemUserMode 返回 true)。在无头体系用户模式下,
体系用户是背景用户,须要其他前台用户与最终用户互动。
Android 14 还引入了无头设备全部者关联模式,可向全部关联用户
(设置了设备全部者的体系用户除外)添加资料全部者。
在配置了无头体系用户的设备(体系用户在背景运行)中,只有全局范围内的
设备政策(适用于全部用户的政策)才会应用于前台用户。如需了解详情,
请参阅 addUserRestriction。
注意:在 Android 14(API 级别 34)中,仅当 DPC 应用支持关联模式时,才可以在配置为
无头体系用户模式设备的设备上设为设备全部者。如需了解详情,
请参阅 HEADLESS_DEVICE_OWNER_MODE_AFFILIATED。
Android 设备制造商可以参考 source.android.com 上发布的指南。
Device Administration API 概览

下面的示例展示了大概使用 Device Administration API 的应用类型:
    电子邮件客户端。
    实行远程清除的安全应用。
    设备管理服务和应用。
工作机制是怎样的?

您可以使用 Device Administration API 来编写用户在其设备上安装的设备管理应用。
设备管理应用会逼迫实行所需的政策。该功能的运作方式如下:
    体系管理员会编写一个设备管理应用,用于逼迫实行远程/本地设备安全政策。
   这些政策可以硬编码到应用中,大概应用可以从第三方服务器动态提取政策。
    该应用已安装在用户的设备上。Android 现在还没有自动配置办理方案。
    体系管理员可通过下面几种方式向用户分发应用:
        Google Play。
        从其他商店启用安装。
        通过其他方式分发应用,例如电子邮件或网站。
    体系会提示用户启用设备管理应用。发生这种情况的方式和时间取决于应用的实现方式。
    用户启用设备管理应用后,就会受到该应用的政策的束缚。
   遵守这些政策通常可带来诸多好处,例如访问敏感体系和数据。
假如用户未启用设备管理应用,则该应用会保留在设备上,但处于不活动状态。
用户将不会受到其政策的束缚,相反也不会获得该应用的任何优势
(例如,他们大概无法同步数据)。
假如用户未能遵守这些政策(例如,用户设置的密码违反了准则),则由应用决定
怎样处理。不过,这通常会导致用户无法同步数据。
假如设备实行连接到的服务器须要 Device Administration API 不支持的政策,
则体系将不允许连接。Device Administration API 现在不支持部分配置。换言之,假如设备
(例如旧版设备)不支持全部声明的政策,则无法允许设备建立连接。
假如设备包含多个已启用的管理应用,体系会实行最严酷的政策。您无法以特定
的管理应用为目的。
如需卸载现有的设备管理应用,用户须要先以管理员身份取消注册该应用。
政策

在企业环境中,员工设备通常必须遵守一组严酷的设备使用政策。
Device Administration API 支持表 1 中列出的政策。
请注意,Device Administration API 现在仅支持用于屏幕锁定的密码:
表 1. Device Administration API 支持的政策。
政策     说明
密码已启用     须要设备要求输入 PIN 码或密码。
密码最小长度     设置密码所需的字符数。例如,您可以要求 PIN 码或密码至少包含六个字符。
须要输入字母数字密码     要求密码由字母和数字组合。可以包含符号字符。
须要输入复杂的密码     要求密码必须包含至少一个字母、一个数字和一个特殊符号。此元素在 Android 3.0 中引入。
密码中要求的最少字母数     全部管理员或特定管理员的密码中要求的最小字母数。在 Android 3.0 中引入。
密码中要求的最少小写字母数     全部管理员或特定管理员的密码中要求的最少小写字母数。在 Android 3.0 中引入。
密码中要求的最少非字母字符数     全部管理员或特定管理员的密码中要求的最少非字母字符数。在 Android 3.0 中引入。
密码中要求的最少数字位数     全部管理员或特定管理员的密码中要求的最少数字位数。在 Android 3.0 中引入。
密码中要求的最少符号数     全部管理员或特定管理员的密码中要求的最少符号数。在 Android 3.0 中引入。
密码中要求的最少大写字母数     全部管理员或特定管理员的密码中要求的最少大写字母数。在 Android 3.0 中引入。
密码逾期超时时间     密码何时逾期,表示为从设备管理员设置逾期超时时间起的增量值(以毫秒为单元)。在 Android 3.0 中引入。
密码历史记录限定     此政策可防止用户重复使用最近用过的 n 个唯一密码。 此政策通常与 setPasswordExpirationTimeout() 联合使用,后者会逼迫用户在指定的一段时间后更新其密码。 在 Android 3.0 中引入。
错误密码实行次数上限     指定在设备擦除其数据之前用户可以输入错误密码的次数。Device Administration API 还允许管理员远程将设备重置为出厂默认设置。这样可以在设备丢失或被盗时保护数据。
最长不活动时间锁定     设置从用户前次触摸屏幕或按下按钮到设备锁定屏幕之前颠末的时长。发生这种情况时,用户须要再次输入其 PIN 码或密码,才能使用其设备和访问数据。该值可介于 1 到 60 分钟之间。
须要存储加密     指定应对存储区域举行加密(假如设备支持)。在 Android 3.0 中引入。
停用相机     指定应停用相机。请注意,这不肯定是永世停用。可以根据上下文、时间等动态启用/停用相机。在 Android 4.0 中引入。
其他功能

除了支持上表中列出的政策之外,Device Administration API 还支持您实行以下利用:
    提示用户设置新密码。
    立即锁定设备。
    清除设备的数据(也就是将设备规复到出厂默认设置)。
示例应用

本页中使用的示例基于 Device Administration API 示例,该示例包含在
SDK 示例(通过 Android SDK 管理器提供)中,在体系上的名称为 <sdk_root>
/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java。
该示例应用演示了设备管理功能。体系会向用户表现一个界面,以便用户启用设备管理
应用。用户启用该应用后,可以使用界面中的按钮实行以下利用:
    设置密码质量。
    指定对用户密码的要求,例如最小长度、必须包含的最少数字字符数等。
    设置密码。假如密码不符合指定的政策,体系会返回错误。
    设置在擦除设备(即规复为出厂设置)之前可以实行多少次失败的密码。
    设置从现在起密码多久会逾期。
    设置密码历史记录的长度(长度是指历史记录中存储的旧密码的数量)。 这可以防止用户重复使用之前用过的 n 个密码之一。
    指定应对存储区域举行加密(假如设备支持)。
    设置设备锁定前可以处于不活动状态的最大时长。
    立即锁定设备。
    清除设备的数据(即规复出厂设置)。
    停用相机。
图 1. 示例应用的屏幕截图
开发设备管理应用

体系管理员可以使用 Device Administration API 来编写逼迫实行远程/本地设备安全政策的应用。
本部分总结了创建设备管理应用所涉及的步调。
创建清单

如需使用 Device Administration API,该应用的清单必须包含以下内容:
    DeviceAdminReceiver 的子类,此中包含以下内容:
        BIND_DEVICE_ADMIN 权限。
        相应 ACTION_DEVICE_ADMIN_ENABLED intent 的本领,在清单中以 intent 过滤器的形式表示。
    元数据中使用的安全政策声明。
以下代码摘录自设备管理示例清单:
<activity android:name=".app.DeviceAdminSample"
            android:label="@string/activity_sample_device_admin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.SAMPLE_CODE" />
    </intent-filter>
</activity>
<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>
请注意:
    以下属性引用了示例应用位于 ApiDemos/res/values/strings.xml
    中的字符串资源。如需具体了解资源,请参阅应用资源。
        android:label="@string/activity_sample_device_admin" 是指 activity
    的用户可读标签。
        android:label="@string/sample_device_admin" 是指权限的用户可读标签。
        android:description="@string/sample_device_admin_description"
    是指权限的用户可读说明。说明通常比标签更长,信息更丰富。
    android:permission="android.permission.BIND_DEVICE_ADMIN" 是 DeviceAdminReceiver
   子类必须具有的权限,用于确保只有体系可以与吸收器交互(不能向任何应用
  授予此权限)。这样可以防止其他应用滥用您的设备管理应用。
    android.app.action.DEVICE_ADMIN_ENABLED 是 DeviceAdminReceiver
   子类必须处理的重要利用,才能允许其管理设备。当用户启用设备管理应用时,
  体系会针对吸收者举行设置。您的代码通常会在 onEnabled()
  中处理此情况。要获得支持,吸收器还必须请求 BIND_DEVICE_ADMIN
  权限,以便其他应用无法滥用该权限。
   当用户启用设备管理应用后,吸收者便有权实行利用来相应特定体系
  事件的广播。当发生相应的事件时,应用便可以施加某项政策。
 例如,假如用户实行设置不符合政策要求的新密码,应用可以提示
 用户选择符合要求的其他密码。
    请避免在发布应用后更改吸收者名称。假如清单中的名称发生更改,
   体系会在用户更新应用时停用设备管理功能。如需了解详情,请参阅 <receiver>。
   android:resource="@xml/device_admin_sample" 声明元数据中使用的安全政策。
   元数据提供特定于设备管理员的其他信息,由 DeviceAdminInfo 类剖析。以下是
   device_admin_sample.xml 的内容:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</device-admin>
在计划设备管理应用时,您无需添加全部政策,只需添加与您的应用相干的政策即可。
如需具体了解清单文件,请参阅 Android 开发者指南。
实当代码

Device Administration API 包含以下类:
DeviceAdminReceiver
    用于实现设备管理组件的基类。
    此类为表明体系发送的原始 intent 利用提供了便利。
    设备管理应用必须包含 DeviceAdminReceiver 子类。
DevicePolicyManager
    用于管理设备上逼迫实行的政策的类。此类的大多数客户端必须已发布用户当前已启用的
    DeviceAdminReceiver。DevicePolicyManager 可管理一个或多个 DeviceAdminReceiver
    实例的政策
DeviceAdminInfo
    此类用于指定设备管理员组件的元数据。
这些类为功能齐备的设备管理应用奠基了底子。本部分的其余部分介绍了怎样使用
DeviceAdminReceiver 和 DevicePolicyManager API 编写设备管理应用。
对 DeviceAdminReceiver 举行子类化
如需创建设备管理应用,您必须子类化 DeviceAdminReceiver。DeviceAdminReceiver
类包含一系列在发生特定事件时触发的回调。
在其 DeviceAdminReceiver 子类中,示例应用为相应特定事件而仅表现 Toast 关照。例如:
Kotlin
  1. class DeviceAdminSample : DeviceAdminReceiver() {
  2.     private fun showToast(context: Context, msg: String) {
  3.         context.getString(R.string.admin_receiver_status, msg).let { status ->
  4.             Toast.makeText(context, status, Toast.LENGTH_SHORT).show()
  5.         }
  6.     }
  7.     override fun onEnabled(context: Context, intent: Intent) =
  8.             showToast(context, context.getString(R.string.admin_receiver_status_enabled))
  9.     override fun onDisableRequested(context: Context, intent: Intent): CharSequence =
  10.             context.getString(R.string.admin_receiver_status_disable_warning)
  11.     override fun onDisabled(context: Context, intent: Intent) =
  12.             showToast(context, context.getString(R.string.admin_receiver_status_disabled))
  13.     override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) =
  14.             showToast(context, context.getString(R.string.admin_receiver_status_pw_changed))
  15. ...
  16. }
复制代码
启用应用

设备管理应用必须处理的一个重要事件是用户启用应用。用户必须明白启用应用,才能逼迫实行政策
。假如用户选择不启用应用,该应用仍会保留在设备上,但体系不会逼迫实行其政策,而且用户将无
法获得该应用的任何好处。

当用户实行触发 ACTION_ADD_DEVICE_ADMIN intent
的利用时,启用应用的过程便会开始。在示例应用中,假如用户点击 Enable Admin
复选框,就会发生这种情况。
当用户点击 Enable Admin 复选框时,表现屏会更改为提示用户激活设备管理应用,如图 2 所示。
图 2. 示例应用:激活应用
下面表现了用户点击 Enable Admin 复选框时实行的代码。这会触发 onPreferenceChange()
回调。当用户已更改此 Preference
的值以及要设置和/或保留该值时,体系将调用此回调。假如用户正在启用该应用,则表现屏会更改
为提示用户激活设备管理应用,如图 2 所示。否则,体系会停用设备管理应用。
Kotlin
  1. override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
  2.     if (super.onPreferenceChange(preference, newValue)) return true
  3.     val value = newValue as Boolean
  4.     if (preference == enableCheckbox) {
  5.         if (value != adminActive) {
  6.             if (value) {
  7.                 // Launch the activity to have the user enable our admin.
  8.                 val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
  9.                     putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample)
  10.                     putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
  11.                             activity.getString(R.string.add_admin_extra_app_text))
  12.                 }
  13.                 startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN)
  14.                 // return false - don't update checkbox until we're really active
  15.                 return false
  16.             } else {
  17.                 dpm.removeActiveAdmin(deviceAdminSample)
  18.                 enableDeviceCapabilitiesArea(false)
  19.                 adminActive = false
  20.             }
  21.         }
  22.     } else if (preference == disableCameraCheckbox) {
  23.         dpm.setCameraDisabled(deviceAdminSample, value)
  24.     }
  25.     return true
  26. }
复制代码
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample) 行指明
mDeviceAdminSample(一个 DeviceAdminReceiver 组件)是目的政策。此行会调用图 2
所示的界面,该界面会引导用户将设备管理员添加到体系(或允许用户拒绝添加)。
当应用须要实行利用(具体取决于启用的设备管理应用)时,它会确认该应用处于活跃状态。为此,
请使用 DevicePolicyManager 方法 isAdminActive()。请注意,DevicePolicyManager 方法
isAdminActive() 接受 DeviceAdminReceiver 组件作为其参数:
Kotlin

private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
管理政策

DevicePolicyManager 是一个公共类,用于管理在设备上逼迫实行的政策。DevicePolicyManager 可管理一个或多个 DeviceAdminReceiver 实例的政策。
您会获得 DevicePolicyManager 的句柄,如下所示:
Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
本部分介绍怎样使用 DevicePolicyManager 实行管理使命:
    设置密码政策
    设置设备锁定
    实行数据清除
设置密码政策

DevicePolicyManager 包含用于设置和逼迫实行设备密码政策的 API。在 Device Administration
API 中,该密码仅适用于屏幕锁定。本部分介绍了常见的密码相干使命。
为设备设置密码

此代码表现了提示用户设置密码的界面:
Kotlin

Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}
设置密码质量

密码质量可以是以下 DevicePolicyManager 常量之一:
PASSWORD_QUALITY_ALPHABETIC
    用户必须输入至少包含字母(或其他符号)字符的密码。
PASSWORD_QUALITY_ALPHANUMERIC
    用户输入的密码必须至少同时包含数字字符和字母(或其他符号)字符。
PASSWORD_QUALITY_NUMERIC
    用户必须输入至少包含数字字符的密码。
PASSWORD_QUALITY_COMPLEX
    用户必须输入至少包含一个字母、一个数字和一个特殊符号的密码。
PASSWORD_QUALITY_SOMETHING
    该政策要求提供某种密码,但并不关心具体是什么。
PASSWORD_QUALITY_UNSPECIFIED
    此政策对密码没有任何要求。
下面的示例展示了怎样设置密码政策,以要求提供字母数字密码:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
设置密码内容要求

从 Android 3.0 开始,DevicePolicyManager 类包含可用于微调密码内容的方法。例如,您可以设置一项政策,声明密码必须包含至少 n 个大写字母。下面是微调密码内容的方法:
    setPasswordMinimumLetters()
    setPasswordMinimumLowerCase()
    setPasswordMinimumUpperCase()
    setPasswordMinimumNonLetter()
    setPasswordMinimumNumeric()
    setPasswordMinimumSymbols()
例如,以下代码段指明密码必须包含至少 2 个大写字母:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
设置密码最小长度

您可以指定密码必须至少为指定的最小长度。例如:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
设置错误密码实行次数上限

您可以设置在擦除设备(即规复出厂设置)之前,允许的错误密码实行次数上限。例如:
Kotlin

val dPMevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
设置密码逾期超时时间

从 Android 3.0 开始,您可以使用 setPasswordExpirationTimeout()方法设置密码的逾期时间
表示为从设备管理员设置逾期超时时间起的增量(以毫秒为单元)。例如:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
根据历史记录限定密码

从 Android 3.0 开始,您可以使用 setPasswordHistoryLength()
方法限定用户重复使用旧密码的本领。此方法接纳长度参数,该参数会指定存储的旧密码数量。启用
此政策后,用户将无法输入与最近 n 个密码匹配的新密码。
这可以防止用户反复使用类似的密码。此政策通常与 setPasswordExpirationTimeout()
联合使用,后者会逼迫用户在指定的一段时间后更新其密码。
例如,此代码段禁止用户重复使用最近使用过的 5 个密码中的恣意一个:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)
设置设备锁定

您可以设置在设备锁定之前可以处于非活动状态的最长限期。例如:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)
您还能够以编程方式告知设备立即锁定:
Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()
实行数据清除

您可以使用 DevicePolicyManager 方法 wipeData() 将设备规复出厂设置。假如设备丢失或被盗,
此功能会非常有效。通常情况下,擦除设备取决于满意特定条件的效果。例如,您可以使用
setMaximumFailedPasswordsForWipe() 声明在密码实行失败的次数到达特定次数后,应擦除设备。
清除数据的方法如下所示:
Kotlin
private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)
wipeData() 方法将其他选项的位掩码作为其参数。现在,该值必须为 0。
停用相机

从 Android 4.0 开始,您可以停用相机。请注意,这不肯定是永世停用。
可以根据具体情况、时间等因素动态启用/停用相机。
您可以使用 setCameraDisabled() 方法控制是否停用相机。
例如,以下代码段根据复选框设置将相机设置为启用或停用:
Kotlin

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)
存储加密

从 Android 3.0 开始,您可以使用 setStorageEncryption() 方法设置要求加密存储区域(假如支持)的政策。
例如:
Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)
如需查察有关怎样启用存储加密的完备示例,请参阅 Device Administration API 示例。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表