Android实例-手机安全卫士(三十一)-根据指令完成相应操作二(锁屏和数据清除)

一、目标

  1、实现远程锁屏和数据销毁操作;

  2、初步制作“一键锁屏”应用和优化。

 

二、代码实现

  1、在Receiver包下新建一个类(取名LockScreenReceiver)继承DeviceAdminReceiver类(是BroadcastReceiver类的一个子类),并在清单配置文件配置receiver标签

    (1)在receiver标签中,增加name、permission属性,name为新建类(LockScreenReceiver)的全路径名称,permission为必须的BIND_DEVICE_ADMIN权限;

    (2)在receiver标签中增加 <meta-data>标签,在<meta-data>标签里增加name、resource属性,name值为"android.app.device_admin",resource值为@xml/device_admin_lockscreen(表示在res文件夹下的xml文件夹中的device_admin_lockscreen.xml文件,需新建)

    (3)在res文件夹下新建文件夹(取名xml),在xml文件夹下新建文件(File)并取名为device_admin_lockscreen.xml,在device_admin_lockscreen.xml中拷贝如下代码:

View Code

    (4)在receiver标签中增加 <intent-filter>标签,设置其name属性值为action.DEVICE_ADMIN_ENABLED;

  2、在com.example.mobilesafe.receiver包下的SMSReceiver类中,创建设备管理器(DevicePolicyManager)对象(取名dpm),

  3、在SMSReceiver类的onReceive方法中,在需要进行“锁屏”操作的if语句(else if("#*lockscreen*#".equals(body)))里面,通过getSystemService(String name)方法实例化设备管理器(DevicePolicyManager)对象(dpm),参数name为DEVICE_POLICY_SERVICE,并强转,再调用其lockNow()方法实现锁屏(优化:判断应用程序在“设备管理器”中是否已激活,详见第8步);

  4、另外可调用设备管理器(DevicePolicyManager)对象(dpm)的resetPassword(String password, int flags)设置解屏后的密码,参数String password为需要设置的密码,int flags为标签,可用0代替;wipeData(int flags)用于清除数据,当参数为0时表示恢复出厂设置,当参数为DevicePolicyManager.WIPE_EXTERNAL_STORAGE时表示格式化SD卡;

 

  5、在手机(模拟器)的系统设置中,安全——>设备管理器,选中“手机卫士”(该信息可在第3步的(1)中的receiver标签属性中新增label、description两个属性以改变其显示内容),点击“激活”

   (以上步骤可以实现“一键锁屏”的应用开发,后续是对“一键锁屏”应用的继续优化) 

  6、快速进入“设备管理器”激活界面。第4步中需要找到手机的“设备管理器”,并手动激活,使用起来较麻烦,因此可通过代码跳转至激活界面。

    (1)可增加“激活设备管理器”按钮并设置点击事件;

    (2)在点击事件代码中新建ComponentName对象(取名openDeviceAdmin),并通过new ComponentName(Context pkg, Class<?> cls)方法实例化,参数Context pkg为上下文、Class<?> cls为需要激活的类(此例中为继承了DeviceAdminReceiver类的类对象,即LockScreenReceiver.class);

    (3)新建Intent对象,并通过Intent(String action)方法实例化,参数String action(动作名)为DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN,再通过Intent对象的putExtra(String name, Parcelable value)将相关额外数据传入,参数String name为DevicePolicyManager.EXTRA_DEVICE_ADMIN、Parcelable value为刚新建的ComponentName对象(openDeviceAdmin),再通过Intent对象的putExtra(String name, Parcelable value)将数据传入,此时参数String name为DevicePolicyManager.EXTRA_ADD_EXPLANATION、Parcelable value为关于激活设备管理器的描述信息;

    (4)调用startActivity(Intent intent)方法启动并跳转至激活界面。

代码如下;

1 ComponentName openDeviceAdmin = new ComponentName(context, LockScreenReceiver.class);
2                     Intent intentopenDeviceAdmin = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
3                     intentopenDeviceAdmin.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,openDeviceAdmin);
4                     intentopenDeviceAdmin.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "关于激活设备管理器的描述信息");
5 startActivity(intentopenDeviceAdmin);
View Code

 

  7、设置卸载“一键锁屏”按钮。由于激活的“设备管理器”在应用程序中无法卸载,因此可为其增加卸载按钮实现自动卸载,提高用户体验。

    (1)可增加“卸载软件”按钮并设置点击事件;

    (2)在点击事件代码中先取消激活“设备管理员”权限,使其成为普通应用:
      ①.新建ComponentName对象(取名openDeviceAdmin),并通过new ComponentName(Context pkg, Class<?> cls)方法实例化,参数Context pkg为上下文、Class<?> cls为需要激活的类(此例中为继承了DeviceAdminReceiver类的类对象,即LockScreenReceiver.class);

      ②.调用设备管理器(DevicePolicyManager)对象(dpm)的removeActiveAdmin(ComponentName who)取消激活ComponentName 对象所对应的类,此例中参数ComponentName who就是①中实例化的ComponentName对象(openDeviceAdmin);

    (3)通过Intent对象卸载普通应用:

      ①.新建Intent对象并通过new Intent()实例化;

      ②.通过Intent对象的setAction(String action)方法增加动作,卸载程序的动作(即方法参数String action的值)为"android.intent.action.VIEW";

      ③.通过Intent对象的addCategory(String category)方法增加类别,参数String category值为"android.intent.category.DEFAULT"(默认);

      ④.通过Intent对象的setData(Uri data)方法增加想要卸载的程序路径,参数Uri data需通过Uri对象的parse(String uriString)方法将程序包全路径名称转成Uri对象,parse()方法的参数String uriString值为"package:"+应用程序包名(可通过getPackageName()获取包名))

      ⑤.调用startActivity(Intent intent)方法启动卸载程序,参数Intent intent为①中新建的Intent对象。

代码如下:

1 Intent intent2 = new Intent();
2                     intent2.setAction("android.intent.action.VIEW");
3                     intent2.addCategory("android.intent.category.DEFAULT");
4                     intent2.setData(Uri.parse("package:"+context.getPackageName()));
5 startActivity(intent2);
View Code

  8、优化:在锁屏前判断是否已经在“设备管理器”中激活应用,以防止出现程序崩溃现象

    (1)调用设备管理器(DevicePolicyManager)对象(dpm)的isAdminActive(ComponentName who)方法判断程序是否已激活,参数ComponentName who同第7步(2)中的①;

    (2)根据isAdminActive(方法)的返回值进行相应操作,若为true则执行锁屏,若为false则执行激活方法;

posted @ 2015-04-15 09:45  红烧大白鲨  阅读(434)  评论(0编辑  收藏  举报