设备管理

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





作者:Tibib 发表于2013-5-23 19:53:09 原文链接 阅读:0 评论:0 查看评论

更多相关文章

  1. Android下Affinities和Task
  2. Android的StrictMode
  3. android:contentDescription 的用途
  4. Android第三方异步网路加载库AsyncHttpClient内部实现缓存策略
  5. Android应用程序添加自定义的property属性
  6. 聊聊Android(安卓)M 6.0 的运行时权限
  7. Android第三方异步网路加载库AsyncHttpClient内部实现缓存策略了
  8. Android进行设备管理(针对企业开发)
  9. android中用XMPP Asmack获取用户朋友的presence(名单列表)的实现

随机推荐

  1. Android(安卓)EditText常用技能,包括clear
  2. Coroutines in Android - One Shot and M
  3. -用Gradle 构建你的android程序
  4. Android(安卓)使用Stetho在Chrome浏览器
  5. 把TextView中的文字添加阴影效果及Style
  6. Android中的?attr/和?android:attr/
  7. React Native在Android当中代码集成
  8. PullToRefreshListView怎么设置各个item
  9. Android开发从零开始视频教程
  10. Android-沉浸式布局的玩法