Android进行设备管理(针对企业开发)

来源:互联网 发布:php短信接口 编辑:程序博客网 时间:2024/04/28 12:37

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




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人流后5天同房了怎么办 人流后3天同房了怎么办 人流20后同房了怎么办 上环后月经量多怎么办 上环后喝啤酒了怎么办 取环当天同房了怎么办 生完孩子有外痔怎么办 怀孕了宫腔积液怎么办 做完爱4天怕怀孕怎么办 半永久眉失败了怎么办 取环前2天同房了怎么办 怀孕了发现有子宫肌瘤怎么办 宫腔中央性粘连怎么办 孕妇宫腔粘连带怎么办 内膜厚怎么办吃什么好 功血引起的贫血怎么办 吃宫血宁后月经不来了怎么办 孕晚期胎心不好怎么办 胎心不好怎么办让住院 39 5胎心不好怎么办 肺长了一个肿瘤怎么办 血糖高伤口不愈合怎么办 有轻微的狐臭该怎么办 嘴上汗毛太重怎么办 风把裙子吹起怎么办 每天三四点醒来就睡不着怎么办 打游戏手汗太多怎么办 老年人胸闷气短呼吸困难怎么办 冒险岛宠物饿了怎么办 不小心喝了黑墨怎么办 压的双眼皮开了怎么办 割了双眼皮显老怎么办 心脏供血不足怎么办呢 怀孕了哮喘犯了怎么办 喝了电解质不拉怎么办 喝电解质散吐了怎么办 皮鞋买大了一号怎么办 皮鞋买小了挤脚怎么办 新买的皮鞋挤脚怎么办 熊类仓鼠变瘦怎么办 喜利得电锤锁了怎么办