作者:zachgenius
原文链接: http://docs.eoeandroid.com/training/enterprise/device-management-policy.html
完成时间:2012-9-4
自从Android 2.2(API等级8),Android平台通过设备管理API提供了系统级的设备管理能力。
这节课中,你将会学到如何通过强制设备管理策略创建一个安全敏感的应用程序。具体来说,程序可以被如此配置,比如它可以在给用户显示受限制的内容之前,确保设置一个足够强度的屏保锁密码。
定义并声明你的策略
首先你需要定义一种在功能层面提供支持的策略。这些策略可以覆盖到屏幕锁密码强度、过期延时、以及加密等等方面。
你必须在res/xml/device_admin.xml
中声明所选择的策略集,它将会被程序强制实行。Android manifest也将引用声明的策略集。
每个声明的策略对应于*DevicePolicyManager* 中的一些相关设备的策略方法(例如定义最小密码长度或最少大写字母数量)。如果一个程序尝试调用在XML中没有对应策略的方法,这将会在运行时导致一个*SecurityException*异常。如果程序打算管理其他策略,那么其他权限,例如'_强制锁(force-lock) ,就会发挥作用。正如你将要看到的,作为设备管理员激活处理(the device administrator activation process)的一部分,声明策略的列表将会在系统屏幕上显示给用户。
如下代码片段在res/xml/device_admin.xml中声明了密码限制策略:
|
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
</uses-policies>
</device-admin>
|
在Android manifest引用到的XML策略声明:
|
<receiver android:name=".Policy$PolicyAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
|
创建一个设备管理接收者(Receiver)
创建一个设备管理广播接收者(broadcast receiver),它能接收到与你声明支持的策略有关的事件的通知。一个程序可以有选择地重写回调函数。
在同样的程序中,Device Admin,当设备管理员(device administrator)账户被用户设置为禁用时,配置好的策略就会从shared preference中擦除。你应该考虑实现与你的应用情况有关的业务逻辑。例如,你的程序可能会采取一些行动来减轻安全风险,比如通过结合实现删除设备上的敏感数据,禁用远程同步,提醒管理员,等等。
为了让广播接收者能够工作,请务必在Android manifest中注册在上面的代码片段所示的内容。
|
public static class PolicyAdmin extends DeviceAdminReceiver {
@Override
public void onDisabled(Context context, Intent intent) {
// Called when the app is about to be deactivated as a device administrator.
// Deletes previously stored password policy.
super.onDisabled(context, intent);
SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);
prefs.edit().clear().commit();
}
}
|
激活设备管理员
在强制执行任何策略之前,用户需要手动将程序激活为设备管理员,下面的程序片段显示了如何在触发设置activity,在这里用户可以激活你的程序。
![](http://docs.eoeandroid.com/images/training/device-mgmt-activate-device-admin.png)
功能1. 用户激活视图,在这里你可以显示你的设备策略的解释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
if (mPolicy.isAdminActive()) {
Intent activateDeviceAdminIntent =
new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
activateDeviceAdminIntent.putExtra(
DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mPolicy.getPolicyAdmin());
// It is good practice to include the optional explanation text to
// explain to user why the application is requesting to be a device
// administrator. The system will display this message on the activation
// screen.
activateDeviceAdminIntent.putExtra(
DevicePolicyManager.EXTRA_ADD_EXPLANATION,
getResources().getString(R.string.device_admin_activation_message));
startActivityForResult(activateDeviceAdminIntent,
REQ_ACTIVATE_DEVICE_ADMIN);
}
|
如果用户选择"Activate",程序就会成为设备管理员并且可以开始配置及强制执行策略。
该程序也需要做好处理用户放弃激活的重置状态的准备,比如点击“取消”按钮,返回键或者HOME键。因此策略设置Activity中的* onResume()* 方法需要有业务逻辑来重新评估这种情况,并展现给用户设备管理激活选项给用户,如果有必要的话。
实现设备策略控制器
在设备管理员被成功激活后,程序就会根据请求的策略来配置设备策略管理器。要记住新的策略在每次发布时都要在Android中添加好。在你的程序中做好平台版本检查,来检测新的策略能否被老版本平台很好的支持。例如,“密码最少大写字符数”策略只有在高于API等级11(Honeycomb)才被支持、以下代码演示了如何在运行时检查版本。
|
DevicePolicyManager mDPM = (DevicePolicyManager)
context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName mPolicyAdmin = new ComponentName(context, PolicyAdmin.class);
...
mDPM.setPasswordQuality(mPolicyAdmin, PASSWORD_QUALITY_VALUES[mPasswordQuality]);
mDPM.setPasswordMinimumLength(mPolicyAdmin, mPasswordLength);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mDPM.setPasswordMinimumUpperCase(mPolicyAdmin, mPasswordMinUpperCase);
}
|
这样程序就可以执行策略了。当程序无法访问使用的正确的锁屏密码的时候,通过设备策略管理器(Device Policy Manager)API可以判定目前的密码是否适用于请求的策略。如果目前的锁屏密码不符合策略,设备管理(device administration)API不会自动改正。明确地启动设置程序中系统密码更改界面是应用程序的责任。例如:
|
if (mDPM.isActivePasswordSufficient()) {
...
// Triggers password change screen in Settings.
Intent intent =
new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
}
|
一般来说,用户可以从可用的锁机制中任选一个,例如“无”,“图案”,“PIN码”(数字),或密码(字母数字)。当一个密码策略配置好后,那些比定义于密码策略弱的密码会被禁用。比如,如果配置了“数字”密码级别,那么用户既可以选PIN码(数字)或者密码(字母数字)。
一旦设备通过设置适当的屏锁密码保护好,应用程序便被允许访问受保护的内容。
|
if (mDPM.isAdminActive(..)) {
// Activates device administrator.
...
} else if (mDPM.isActivePasswordSufficient()) {
// Launches password set-up screen in Settings.
...
} else {
// Grants access to secure content.
...
startActivity(new Intent(context, SecureActivity.class));
}
|