设备管理

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异常,具体定义如下

<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 />        <disable-keyguard-features />    </uses-policies></device-admin>

接收设备管理中一些事件

在进行设备管理的操作中,根据具体的业务逻辑可能需要知晓一些重要事件,比如取消激活设备管理事件,这个事件就很重要了,我们必须得知道用户进行了此项操作,从而来进行一些逻辑的处理或者提示用户,还有许多的事件这里就不一一说了,具体详见DeviceAdminReceiver(http://developer.android.com/training/enterprise/device-management-policy.html#CreateDeviceAdminReceiver),我们可以继承DeviceAdminReceiver,覆写一些回调方法,具体可能如下

public class AdminReceiver extends DeviceAdminReceiver {@Overridepublic DevicePolicyManager getManager(Context context) {return super.getManager(context);}@Overridepublic ComponentName getWho(Context context) {return super.getWho(context);}/** * 禁用 */@Overridepublic void onDisabled(Context context, Intent intent) {Toast.makeText(context, "禁用设备管理", Toast.LENGTH_SHORT).show();super.onDisabled(context, intent);}@Overridepublic CharSequence onDisableRequested(Context context, Intent intent) {return super.onDisableRequested(context, intent);}/** * 激活 */@Overridepublic void onEnabled(Context context, Intent intent) {Toast.makeText(context, "启动设备管理", Toast.LENGTH_SHORT).show();super.onEnabled(context, intent);}@Overridepublic void onPasswordChanged(Context context, Intent intent) {super.onPasswordChanged(context, intent);}@Overridepublic void onPasswordFailed(Context context, Intent intent) {super.onPasswordFailed(context, intent);}@Overridepublic void onPasswordSucceeded(Context context, Intent intent) {super.onPasswordSucceeded(context, intent);}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}@Overridepublic IBinder peekService(Context myContext, Intent service) {//Logger.d("------" + "peekService" + "------");return super.peekService(myContext, service);}}
当然还需像正常的Receiver一样得在Manifest文件中进行注册,还行注意的是在注册过程中还需引用我们刚才声明定义好的策略列表

        <receiver            android:name=".receiver.AdminReceiver"            android:description="@string/device_des"            android:label="@string/device_label"            android:permission="android.permission.BIND_DEVICE_ADMIN" >            <meta-data                android:name="android.app.device_admin"                android:resource="@xml/device_manager" />            <intent-filter>                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />            </intent-filter>        </receiver>

激活设备管理员

在策略执行之前,我们必须让我们的应用成为设备管理员,这样权限去执行一些设备管理的策略,因为设备管理涉及到一些对设备或用户数据的操作,所以这一步骤必须得让用户知道,让用户来选择,我们不能在后台默默的做这一件事,不过个人认为这也不是一项很好的操作,很多用户就算给他提示了,把选择权让给他了,也不会明其理,这可能会导致一些不法应用做一些恶心的破坏(直接把sdcard中所有的数据都清除)

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)方法来知晓用户的选择

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);Log.i("INFO", "requestCode : " + requestCode + "   resultCode:"+resultCode );}

当用户选择了Activate时,我们就可以来执行声明定义好的策略了,在这里只介绍下擦除数据策略的使用

mPolicyManager.wipeData(0);

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





更多相关文章

  1. android中用XMPP Asmack获取用户朋友的presence(名单列表)的实现
  2. Android(安卓)开发小工具之:Custom Tabs
  3. 3.6.3新版本AndroidStudio报Could not resolve all artifacts fo
  4. Android(安卓)轻松实现语音识别
  5. Android简单登录系统
  6. Android(安卓)设备管理API概览(Device Administration API)
  7. 学习Android之用户界面基础
  8. 惊艳的Android(安卓)5.0与中国无关
  9. Android仿人人客户端(v5.7.1)——个人主页(三)

随机推荐

  1. 【Android】获取设备标识号
  2. Android(安卓)Framework 源码之旅 ——
  3. android Button 的按下和抬起事件监听
  4. phoneGap 基于android 实例 一
  5. Android前景,前途
  6. Linux 环境下安装 Nexus 私服存储库
  7. android framework下载学习
  8. ListView中的CheckedTextView 多选/单
  9. 快应用 QuickApp:配置开发环境 和 第一个
  10. Android智能识别 - 银行卡区域裁剪(原理篇