codecamp

Android 创建设备策略控制器

编写:zenlynn 原文:http://developer.android.com/training/enterprise/work-policy-ctrl.html

在 Android for Work 的部署中,企业需要保持对员工设备的某些方面的控制。企业需要确保工作相关的信息被加密,并与员工的私人数据分离。企业也可能需要限制设备的功能,例如设备是否被允许使用相机。而且企业也可能需要那些被批准的应用提供应用限制,所以企业可以根据需要关闭或打开应用的功能。

为了处理这些任务,企业开发并部署设备策略控制器应用(以前称为工作策略控制器)。该应用被安装在每一个员工的设备中。安装在每一个员工设备中的控制应用创建了一个企业用户 profile,它可以区别用户的私人账户以访问企业应用和数据。该控制应用同时也是企业管理软件和设备之间的桥梁;当企业需要改变配置的时候就告诉控制应用,然后控制应用适当地为设备和其他应用改变设置。

该课程描述了如何在 Android for Work 的部署中为设备开发一个设备策略控制器。该课程描述了如何创建一个企业用户 profile,如何设置设备策略,以及如何在 managed profile 中为其他运行中的应用进行限制。

注意:该课程的内容并不包括在企业控制之下,设备中唯一的 profile 就是 managed profile 的情况。

设备管理概述

在 Android for Work 的部署中,企业管理员可以设置策略来控制员工设备和应用的行为。企业管理员用企业移动管理(EMM)供应商提供的软件设置这些策略。EMM 软件与每一个设备上的设备策略控制器进行通讯。设备策略控制器相应地对每一个私人设备上企业用户 profile 的设置和行为进行管理。

设备政策管理器内置于设备管理应用现有的模式中,如设备管理中所说。特别是,你的应用需要创建 DeviceAdminReceiver 的子类,如上述文件所说。

Managed profiles

用户经常想在企业环境中使用他们的私人设备。这种情况可能让企业陷入困境。如果用户使用他们的私人设备,企业不得不担心在这个不受控制的设备上的机密信息(例如员工的电子邮件和通讯录)。

为了处理这种情况,Android 5.0(API 21)允许企业使用 managed profile 建立一个特别的企业用户 profile,或是在 Android for Work 计划中建立一个企业 profile。如果设备有企业 managed profile,该 profile 的设置是在企业管理员的控制之下的。管理员可以选择在这个 profile 之下,什么应用程序可以运行,什么设备功能可以允许。

创建 Managed Profile

要在一个已经有了私人 profile 的设备上创建一个 managed profile,首先得看看该设备是否支持 FEATURE_MANAGED_USERS 系统特性,才能确定该设备是否支持 managed profile:

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {

    // This device does not support native managed profiles!

}

如果该设备支持 managed profile,通过发送一个带有 ACTION_PROVISION_MANAGED_PROFILE 行动的 intent 来创建一个 managed profile。另外要包括该设备的管理包名。

Activity provisioningActivity = getActivity();

// You'll need the package name for the WPC app.
String myWPCPackageName = "com.example.myWPCApp";

// Set up the provisioning intent
Intent provisioningIntent =
        new Intent("android.app.action.PROVISION_MANAGED_PROFILE");
intent.putExtra(myWPCPackageName,
        provisioningActivity.getApplicationContext().getPackageName());

if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager())
         == null) {

    // No handler for intent! Can't provision this device.
    // Show an error message and cancel.
} else {

    // REQUEST_PROVISION_MANAGED_PROFILE is defined
    // to be a suitable request code
    startActivityForResult(provisioningIntent,
            REQUEST_PROVISION_MANAGED_PROFILE);
    provisioningActivity.finish();
}

系统通过以下行为响应这个 intent:

  • 验证设备是被加密的。如果没有加密,在继续操作之前系统会提示用户对设备进行加密。
  • 创建一个 managed profile。
  • 从 managed profile 中移除非必需的应用。
  • 复制设备策略控制器应用到 managed profile 中,并将设备策略控制器设置为该 profile 的所有者。

如以下实例代码所示,重写 onActivityResult() 来查看部署是否完成。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    // Check if this is the result of the provisioning activity
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {

        // If provisioning was successful, the result code is 
        // Activity.RESULT_OK
        if (resultCode == Activity.RESULT_OK) {
            // Hurray! Managed profile created and provisioned!
        } else {
            // Boo! Provisioning failed!
        }
        return;

    } else {
        // This is the result of some other activity, call the superclass
        super.onActivityResult(requestCode, resultCode, data);
    }
}

创建 Managed Profile 之后

当 profile 部署完成,系统调用设备策略控制器应用的 DeviceAdminReceiver.onProfileProvisioningComplete() 方法。重写该回调方法来完成启用 managed profile。

通常,你的 DeviceAdminReceiver.onProfileProvisioningComplete() 会执行这些任务:

  • 如果设备使用 Google Play for Work,用 AccountManager.addAccount() 在 managed profile 中添加 Google 账号,管理员就能往设备中安装应用了。

一旦你完成了这些任务,调用设备策略管理器的 setProfileEnabled() 方法来激活 managed profile:

// Get the device policy manager
DevicePolicyManager myDevicePolicyMgr =
        (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

ComponentName componentName = myDeviceAdminReceiver.getComponentName(this);

// Set the name for the newly created managed profile.
myDevicePolicyMgr.setProfileName(componentName, "My New Managed Profile");

// ...and enable the profile
manager.setProfileEnabled(componentName);

建立设备策略

设备策略管理器应用负责实行企业的设备策略。例如,某个企业可能需要在输错一定次数的设备密码后锁定所有设备。该控制器应用需要 EMM 查出当前的策略是什么,然后使用设备管理 API 来实行这些策略。

更多关于如何实行设备策略的信息,请查看设备管理指南。

实行应用限制

企业环境可能需要那些批准的应用实现安全性或功能限制。应用开发人员必须实现这些限制,并声明由企业管理员使用,如实现应用的限制所说。设备政策管理器接收来自企业管理员改变的限制,并将这些限制的改变传送给相关应用。

例如,某个新闻应用有一个控制应用是否允许在蜂窝网络下下载视频的限制设定。当 EMM 想要禁用蜂窝下载,它就给控制器应用发送通知。于是控制器应用转而通知新闻应用限制设定被改变了。

注意:本文档涵盖了设备策略管理器应用如何改变 managed profile 中其他应用的限制设定。关于设备策略管理器应用如何与 EMM 进行通讯的细节并不在本文档的范围之内。

为了改变一个应用的限制,调用 DevicePolicyManager.setApplicationRestrictions() 方法。该方法需要传入三个参数:该控制器应用的 DeviceAdminReceiver,限制被改变的应用的包名,以及包含了你想要设置的限制的 Bundle

例如,假设 managed profile 中有一个应用包名是 "com.example.newsfetcher"。该应用有一个布尔型限制可以被配置,key 是 "downloadByCellular"。如果这个限制被设置为 false,该应用在蜂窝网络下就不能下载数据,它必须使用 Wi-Fi 网络代替。

如果你的设备策略管理器应用需要关掉蜂窝下载,它首先要取得设备策略服务对象,如上文所说。然后集合一个限制 bundle 并将该 bundle 传入 setApplicationRestrictions()

// Fetch the DevicePolicyManager
DevicePolicyManager myDevicePolicyMgr =
        (DevicePolicyManager) thisActivity
                .getSystemService(Context.DEVICE_POLICY_SERVICE);

// Set up the restrictions bundle
bundle restrictionsBundle = new Bundle();
restrictionsBundle.putBoolean("downloadByCellular", false);

// Pass the restrictions to the policy manager. Assume the WPC app
// already has a DeviceAdminReceiver defined (myDeviceAdminReceiver).
myDevicePolicyMgr.setApplicationRestrictions(
        myDeviceAdminReceiver, "com.example.newsfetcher", restrictionsBundle);

注意:该设备策略服务将限制改变传递给了你所指定的应用。然而,实际是由应用来执行该限制。例如,在这个情况中,该应用要负责禁用它本身的使用蜂窝网络下载视频的功能。设置限制并不能让系统强制在应用上实现限制。


Android 实现 app 的限制
Android 设计高效的导航
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Android 后台任务

Android 使用CursorLoader在后台加载数据

Android 管理设备的唤醒状态

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }