配置 COSU 设备

编写:zenlynn 原文:https://developer.android.com/training/enterprise/cosu.html

作为一个 IT 管理员,你可以将 Android 6.0 Marshmallow 以及更高版本的设备配置为企业拥有、功能单一(COSU)的设备。这些 Android 设备用于单一目的,比如数字标牌、票据打印、销售点或者库存管理。要将 Android 设备作为 COSU 设备使用,你需要开发客户可以管理的 Android 应用。

你的客户可以配置 COSU 设备:

  • 锁定一个应用在屏幕上,隐藏主页和最近使用的按钮来防止用户离开该应用。
  • 允许多个应用出现在屏幕上,比如有目录的图书馆和网络浏览器。

固定应用 vs 锁定任务模式

Android 5.0 Lollipop 系统引进了两种方式来配置单一目的的 Android 设备:

  • 通过固定应用,设备用户可以将特定的应用临时固定在屏幕上。
  • 通过锁定任务模式,用户无法离开该应用,且主页和最近使用的按钮都被隐藏了。此外,锁定任务模式使得 IT 管理员可以用更可靠的方式来管理 COSU 设备,如下面所讨论的。

这是固定应用和锁定任务模式之间功能比较的图表:

配置 COSU 设备 - 图1

Figure 1. Lollipop 系统的固定应用和 Marshmallow 以及更高版本系统的锁定任务模式之间的比较

在 Lollipop 系统中,你可以固定一个应用来覆盖整个屏幕,但是只有被设备策略控制器(DPC)加入白名单的应用才可以被锁定。

如何使用锁定任务模式

为了使用锁定任务模式以及管理 COSU 设备的接口,设备必须安装设备所有者应用。设备所有者是一种设备策略控制器(DPC),用来管理整个设备。更多关于 DPC 的信息,请查看 EMM 开发人员概述

如果你创建了一个新的 COSU 应用,我们建议你为 Marshmallow 以及更高版本的系统开发该应用。因为这些系统包括以下 COSU 特性:

  • 控制系统更新
  • 设置状态和菜单栏可见
  • 禁用屏幕锁定以及睡眠功能
  • 在锁定任务模式中允许切换应用
  • 在安全模式中防止重启

注意:如果你为 Marshmallow 系统的设备开发 COSU 特性,你的应用仍然可以与 Android 早期版本兼容。

Marshmallow 系统附加的 COSU 管理特性使得开发、部署 Android 设备为功能单一的设备更加容易。如果你想要增强服务端应用限制或服务端 profile 策略控制,你需要使用 EMM 或为你应用添加 DPC。当你创建应用的时候请按照以下说明做。

创建 COSU 解决方案

管理 COSU 设备有两个不同的方法:

  • 使用第三方企业移动管理(EMM)解决方案:使用 EMM,你需要做的所有就是设置锁定任务模式。更多信息,请跳到下一个部分,第三方 EMM 管理的解决方案
  • 高级设置——创建你自己的 DPC 应用:这部分内容需要更多的工作,是为了高级开发人员而设。选择这个方法,你需要设置好设备才可以对它进行管理、建立接口、建立 DPC 并测试。更多说明,请跳到创建你自己的 DPC 应用

第三方 EMM 管理的解决方案

在这个部分,你只需要做少量的开发就可以让你的设备在第三方 EMM 下工作。

使用 startLockTask()

如果你需要添加 COSU 功能到已存在的应用中,要确保客户的 EMM 支持 lockTaskMode

  • 你的活动调用 startLockTask()
    • 请求将用户锁定在当前任务
    • 防止启动其他应用、设置以及主页按钮

从 Marshmallow 系统开始,如果你的应用被 EMM 用 setLockTaskPackages 添加到白名单中,那么在应用被启动后,你的活动可以自动开始锁定任务模式。

设置锁定任务模式属性

lockTaskMode 允许你在 AndroidManifest.xml 文件里定义你的应用的锁定任务模式行为:

  • 系统应用和特许应用也可以将 lockTaskMode 设置为 always。该设定会让你活动里的任务总是启动到锁定任务模式。对待非特许应用与平常一样。

为了让你的活动自动进入 lockTaskMode,要把这个属性值改为 if_whitelisted。这么做可以让你的应用以这种方式表现:

  • 如果你的应用不是 lockTaskMode 的白名单,它会表现得像平常一样。
  • 如果你的应用是系统应用或特许应用,且属于白名单,当应用启动的时候,lockTaskMode 会自动开始。

示例 XML 如下:

  1. <activity android:name=".MainActivity" android:lockTaskMode="if_whitelisted">

有了这些选项,你仍然需要创建一个调用 stopLockTask() 的机制,用户才能退出 ockTaskMode

高级设置——创建你自己的 DPC 应用

为了在 COSU 中管理应用,你需要一个 DPC 作为设备所有者运行,来设置设备的一些策略。

注意:这个设置是高级的,且需对 EMM 开发人员概述所说的 EMM 概念有透彻的认识。更多关于创建 DPC 的信息,请查看提供用户设备

为了创建可以管理 COSU 设备配置的 DPC 应用,该 DPC 需要:

  1. 提供进入设备所有者模式的设备。我们建议你支持提供近场通讯。更多信息,请查看通过 NFC 提供的设备所有者

  2. 使用以下接口:

这个示例展示了如何实现开始锁定任务模式、执行相关的 COSU 设备管理接口的活动:

  1. public class CosuActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. mAdminComponentName = DeviceAdminReceiver.getComponentName(this);
  6. mDevicePolicyManager = (DevicePolicyManager) getSystemService(
  7. Context.DEVICE_POLICY_SERVICE);
  8. mPackageManager = getPackageManager();
  9. setDefaultCosuPolicies(true);
  10. }
  11. @Override
  12. protected void onStart() {
  13. super.onStart();
  14. // start lock task mode if it's not already active
  15. ActivityManager am = (ActivityManager) getSystemService(
  16. Context.ACTIVITY_SERVICE);
  17. // ActivityManager.getLockTaskModeState api is not available in pre-M.
  18. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  19. if (!am.isInLockTaskMode()) {
  20. startLockTask();
  21. }
  22. } else {
  23. if (am.getLockTaskModeState() ==
  24. ActivityManager.LOCK_TASK_MODE_NONE) {
  25. startLockTask();
  26. }
  27. }
  28. }
  29. private void setDefaultCosuPolicies(boolean active) {
  30. // set user restrictions
  31. setUserRestriction(DISALLOW_SAFE_BOOT, active);
  32. setUserRestriction(DISALLOW_FACTORY_RESET, active);
  33. setUserRestriction(DISALLOW_ADD_USER, active);
  34. setUserRestriction(DISALLOW_MOUNT_PHYSICAL_MEDIA, active);
  35. setUserRestriction(DISALLOW_ADJUST_VOLUME, active);
  36. // disable keyguard and status bar
  37. mDevicePolicyManager.setKeyguardDisabled(mAdminComponentName, active);
  38. mDevicePolicyManager.setStatusBarDisabled(mAdminComponentName, active);
  39. // enable STAY_ON_WHILE_PLUGGED_IN
  40. enableStayOnWhilePluggedIn(active);
  41. // set System Update policy
  42. if (active){
  43. mDevicePolicyManager.setSystemUpdatePolicy(mAdminComponentName,
  44. SystemUpdatePolicy.createWindowedInstallPolicy(60,120));
  45. }
  46. else
  47. // set this Activity as a lock task package
  48. mDevicePolicyManager.setLockTaskPackages(mAdminComponentName,
  49. active ? new String[]{getPackageName()} : new String[]{});
  50. IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MAIN);
  51. intentFilter.addCategory(Intent.CATEGORY_HOME);
  52. intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
  53. if (active) {
  54. // set Cosu activity as home intent receiver so that it is started
  55. // on reboot
  56. mDevicePolicyManager.addPersistentPreferredActivity(
  57. mAdminComponentName, intentFilter, new ComponentName(
  58. getPackageName(), CosuModeActivity.class.getName()))
  59. } else {
  60. mDevicePolicyManager.clearPackagePersistentPreferredActivities(
  61. mAdminComponentName, getPackageName());
  62. }
  63. }
  64. private void setUserRestriction(String restriction, boolean disallow) {
  65. if (disallow) {
  66. mDevicePolicyManager.addUserRestriction(mAdminComponentName,
  67. restriction);
  68. } else {
  69. mDevicePolicyManager.clearUserRestriction(mAdminComponentName,
  70. restriction);
  71. }
  72. }
  73. private void enableStayOnWhilePluggedIn(boolean enabled) {
  74. if (enabled) {
  75. mDevicePolicyManager.setGlobalSetting(
  76. mAdminComponentName,
  77. Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
  78. BatteryManager.BATTERY_PLUGGED_AC
  79. | BatteryManager.BATTERY_PLUGGED_USB
  80. | BatteryManager.BATTERY_PLUGGED_WIRELESS);
  81. } else {
  82. mDevicePolicyManager.setGlobalSetting(
  83. mAdminComponentName,
  84. Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0);
  85. }
  86. }
  87. // TODO: Implement the rest of the Activity
  88. }

为 COSU 开发测试计划

如果你计划支持第三方 EMM,那么利用 EMM 应用开发一个终端到终端的测试计划。我们同样提供测试资源,让你可以用来创建你自己的测试设备策略客户端(测试 DPC):