Android从2.2版本开始,提供了一套设备管理API来进行Android手机设备的管理工作,其中包含设备锁屏、禁用启用摄像头(4.0开始提供)、擦除用户数据(也可擦除sdcard中的数据,不过要到2.3)等一系列的设备管理策略,具体可参见DevicePolicyManager类中的定义(http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html),下面是一些具体的步骤~
在使用设备管理功能前需在res/xml/device_admin.xml 中声明和定义要使用的设备策略,这些声明和定义的策略将会被我们的应用程序执行,如果你执行了没在 res/xml/device_admin.xml 声明和定义的策略,那将会抛出 SecurityException
异常,具体定义如下
在进行设备管理的操作中,根据具体的业务逻辑可能需要知晓一些重要事件,比如取消激活设备管理事件,这个事件就很重要了,我们必须得知道用户进行了此项操作,从而来进行一些逻辑的处理或者提示用户,还有许多的事件这里就不一一说了,具体详见DeviceAdminReceiver(http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver),我们可以继承DeviceAdminReceiver,覆写一些回调方法,具体可能如下
public class AdminReceiver extends DeviceAdminReceiver {
@Override
public DevicePolicyManager getManager(Context context) {
return super.getManager(context);
}
@Override
public ComponentName getWho(Context context) {
return super.getWho(context);
}
/**
* 禁用
*/
@Override
public void onDisabled(Context context, Intent intent) {
Toast.makeText(context, "禁用设备管理", Toast.LENGTH_SHORT).show();
super.onDisabled(context, intent);
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
return super.onDisableRequested(context, intent);
}
/**
* 激活
*/
@Override
public void onEnabled(Context context, Intent intent) {
Toast.makeText(context, "启动设备管理", Toast.LENGTH_SHORT).show();
super.onEnabled(context, intent);
}
@Override
public void onPasswordChanged(Context context, Intent intent) {
super.onPasswordChanged(context, intent);
}
@Override
public void onPasswordFailed(Context context, Intent intent) {
super.onPasswordFailed(context, intent);
}
@Override
public void onPasswordSucceeded(Context context, Intent intent) {
super.onPasswordSucceeded(context, intent);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
@Override
public IBinder peekService(Context myContext, Intent service) {
//Logger.d("------" + "peekService" + "------");
return super.peekService(myContext, service);
}
}
当然还需像正常的Receiver一样得在Manifest文件中进行注册,还行注意的是在注册过程中还需引用我们刚才声明定义好的策略列表
private void setDeviceManager() {
//获取设备管理服务
mPolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
//AdminReceiver 继承自 DeviceAdminReceiver
mPlcManagerCn = new ComponentName(this, AdminReceiver.class);
if(!mPolicyManager.isAdminActive(mPlcManagerCn)){
activeAdminManager(mPlcManagerCn);
}
}
/**
* 激活设备管理器
*/
private void activeAdminManager(ComponentName cn){
// 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
//权限列表
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, cn);
//描述(additional explanation)
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.device_des));
startActivityForResult(intent, 100);
}
我们可以通过覆写onActivityResult(int requestCode, int resultCode, Intent data)方法来知晓用户的选择
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i("INFO", "requestCode : " + requestCode + " resultCode:"+resultCode );
}
mPolicyManager.wipeData(0);
WIPE_EXTERNAL_STORAGE
,当为0时代表只清除用户数据(你手机中应用存储的所有数据,应用是否会卸载掉因手机而不同),当为
WIPE_EXTERNAL_STORAGE
时会连带sdcard中的数据也会清除掉,这一点需要特别的注意
最后需要注意的是,设备管理API是在2.2之后陆续加入的,所以在具体的应用中还需对设备操作系统的版本进行判断,看看是否支持该策略。在所有的策略中密码策略是最为复杂也最为完善。如果想学习更多,大家可以到http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver了解基本 操作和http://developer.android.com/guide/topics/admin/device-admin.html中有更详细的介绍
参考文章:http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver
http://developer.android.com/guide/topics/admin/device-admin.html