Android 2.2通过提供Android Device Administration API引入了对企业应用程序的支持。设备管理API在系统级提供设备管理功能。提供了 提示用户设置新的密码,立即锁定设备,擦除设备的数据(即将设备恢复为出厂默认设置)等功能。
它是如何工作的:
-
您可以使用设备管理API编写用户在设备上安装的设备管理应用程序。设备管理员应用程序执行所需的策略。
-
如果用户不启用设备管理应用程序,它将保留在设备上,但处于非活动状态。
-
如果用户不遵守这些策略(例如,如果用户设置了违反指导原则的密码),则由应用程序决定如何处理。
-
如果设备尝试连接到需要Device Administration API不支持的策略的服务器,则连接将不被允许。设备管理API目前不允许部分设置。换句话说,如果设备(例如,传统设备)不支持所有规定的策略,则无法允许设备连接。
-
如果设备包含多个启用的管理应用程序,则会严格执行最严格的策略。没有办法针对特定的管理应用程序。
-
要卸载现有的设备管理员应用程序,用户需要先以管理员的身份注销应用程序。
2.设备API支持的策略
- 启用密码
要求设备要求输入PIN或密码 - 需要存储加密
指定存储区域应该加密,如果设备支持。在Android 3.0中引入。 - 禁用相机
指定应禁用相机。请注意,这不一定是永久禁用。可以根据上下文,时间等动态启用/禁用摄像头。在Android 4.0中引入。 - 立即锁定设备
- 擦除设备的数据(即将设备恢复为出厂默认设置)。
开发设备管理应用程序
a)创建DeviceAdminReceiver的子类
要创建设备管理员应用程序,您必须创建 DeviceAdminReceiver的子类。这个DeviceAdminReceiver类包含一系列的回调,当特定的事件发生的时候触发。
public class DeviceAdminSample extends DeviceAdminReceiver {
@Override
public DevicePolicyManager getManager(Context context) {
Log.e("AdminReceiver","getManager()");
return super.getManager(context);
}
@Override
public ComponentName getWho(Context context) {
Log.e("AdminReceiver","getWho()");
return super.getWho(context);
}
@Override
public String onChoosePrivateKeyAlias(Context context, Intent intent,
int uid, Uri uri, String alias) {
Log.e("AdminReceiver","onChoosePrivateKeyAlias()");
return super.onChoosePrivateKeyAlias(context, intent, uid, uri, alias);
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
Log.e("AdminReceiver","onDisableRequested()");
return super.onDisableRequested(context, intent);
}
@Override
public void onDisabled(Context context, Intent intent) {
Log.e("AdminReceiver","onDisabled()");
super.onDisabled(context, intent);
}
@Override
public void onEnabled(Context context, Intent intent) {
Log.e("AdminReceiver","onEnabled()");
super.onEnabled(context, intent);
}
@Override
public void onLockTaskModeEntering(Context context, Intent intent,
String pkg) {
Log.e("AdminReceiver","onLockTaskModeEntering()");
super.onLockTaskModeEntering(context, intent, pkg);
}
@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
Log.e("AdminReceiver","onLockTaskModeExiting()");
super.onLockTaskModeExiting(context, intent);
}
@Override
public void onPasswordChanged(Context context, Intent intent) {
Log.e("AdminReceiver","onPasswordChanged()");
super.onPasswordChanged(context, intent);
}
@Override
public void onPasswordExpiring(Context context, Intent intent) {
Log.e("AdminReceiver","onPasswordExpiring()");
super.onPasswordExpiring(context, intent);
}
@Override
public void onPasswordFailed(Context context, Intent intent) {
Log.e("AdminReceiver","onPasswordFailed()");
super.onPasswordFailed(context, intent);
}
@Override
public void onPasswordSucceeded(Context context, Intent intent) {
Log.e("AdminReceiver","onPasswordSucceeded()");
super.onPasswordSucceeded(context, intent);
}
@Override
public void onProfileProvisioningComplete(Context context, Intent intent) {
Log.e("AdminReceiver","onProfileProvisioningComplete()");
super.onProfileProvisioningComplete(context, intent);
}
@Override
public void onReadyForUserInitialization(Context context, Intent intent) {
Log.e("AdminReceiver","onReadyForUserInitialization()");
super.onReadyForUserInitialization(context, intent);
}
@Override
public void onReceive(Context context, Intent intent) {
Log.e("AdminReceiver","onReceive()");
super.onReceive(context, intent);
}
@Override
public void onSystemUpdatePending(Context context, Intent intent,
long receivedTime) {
Log.e("AdminReceiver","onSystemUpdatePending()");
super.onSystemUpdatePending(context, intent, receivedTime);
}
}
在AndroidManifex.xml中注册广播
<receiver android:name=".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>
-
android:label="@string/activity_sample_device_admin" 指的是活动的用户可读标签。
-
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权限,以便其他应用程序不能滥用它。
-
当用户启用设备管理员应用程序时,该设备管理员应用程序允许接收者执行操作以响应特定系统事件的广播。当适当的事件发生时,应用程序可以施加一个策略。例如,如果用户尝试设置不符合策略要求的新密码,则应用程序可以提示用户选择符合要求的不同密码。
-
避免在发布应用程序后更改接收者名称。如果清单中的名称发生更改,则用户更新应用程序时将禁用设备管理员。
-
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>
管理在设备上执行的策略的类。
private DevicePolicyManager manager;
private ComponentName component;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_admin);
manager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
component = new ComponentName(this, AdminReceiver.class);
}
启用设备管理
if(manager.isDeviceOwnerApp(getPackageName())){
showToast("应用程序处于已经授权管理员权限");
}else{
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, component);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "只有激活管理员权限才能锁屏");
startActivity(intent);
}
消除
manager.removeActiveAdmin(component);
锁屏
if(manager.isAdminActive(component)){
// 设备立即锁屏
manager.lockNow();
// manager.resetPassword("123", 0);
// 设备在1s内没有操作锁屏
// manager.setMaximumTimeToLock(component, 1000);
}else{
showToast("设备管理器没有激活");
}
设置密码
if(manager.isAdminActive(component)){
//manager.resetPassword("123", 0);
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
}else{
showToast("设备管理器没有激活");
}
清除数据
if(manager.isAdminActive(component)){
manager.wipeData(0);
// 密码失败后檫除设备数据
// manager.setMaximumFailedPasswordsForWipe(component, 0);
}else{
showToast("设备管理器没有激活");
}
禁用摄像头
if(manager.isAdminActive(component)){
boolean flag = manager.getCameraDisabled(component);
Log.e("DemoDeviceAdminActivity", "相机是否可用:"+flag);
manager.setCameraDisabled(component, !flag);
}else{
showToast("设备管理器没有激活");
}
加密数据
if(manager.isAdminActive(component)){
boolean flag = manager.getStorageEncryption(component);
Log.e("DemoDeviceAdminActivity", "数据是否加密:"+flag);
manager.setStorageEncryption(component, !flag);
}else{
showToast("设备管理器没有激活");
}
网友评论