Android设备管理员——DevicePolicyManager

Linux大全评论1.5K views阅读模式

Android 2.2 SDK提供了一个可管理和操作设备的API叫DevicePolicyManager,使用这个API你可以接管手机的应用权限,对手机做出很多大胆的操作,比如锁屏、恢复出厂设置、设置密码、强制清除密码,修改密码、设置屏幕灯光渐暗时间间隔等操作。

这个API让你的程序直接掌握了系统的命脉。

但是,同样的道理,别人也可以做类似的程序,各程序之间的权限是不起冲突的~

首先,要想调用DevicePolicyManager,那么我们必须先要注册一个admin,如何注册呢,也是需要通过代码去注册。有了admin权限,我们才可能对系统进行上述功能的操作。

其次,程序在启动激活的时候,会给用户相应提示,只有当用户点击“激活”后,我们的代码才能真正的运转。(其实我也想跳过用户激活操作,但是还没研究出来...如果成功了,那就算是真正的成功了)

再有,就是创建权限啊,监听了。

下面来看代码:

第一步,注册一个广播类,用于监听权限的变化:

  1. <receiver android:name=".deviceAdminReceiver" android:label="@string/app_name"  
  2.     android:description="@string/description" android:permission="android.permission.BIND_DEVICE_ADMIN">  
  3.   
  4.     <meta-data android:name="android.app.device_admin"  
  5.                 android:resource="@xml/device_admin" />  
  6.   
  7.     <intent-filter>  
  8.         <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />  
  9.     </intent-filter>  
  10.   
  11. </receiver>  

android:permission 表示此功能需要的权限。

android:name="android.app.action.DEVICE_ADMIN_ENABLED"表示此动作的跳转界面。

<meta-data android:name="android.app.device_admin"android:resource="@xml/device_admin" />表示这个应用可以管理的权限清单。 

XML清单:

  1. <span style="color:#000000;"><?xml version="1.0" encoding="utf-8"?>  
  2. <device-admin xmlns:android="<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>">   
  3.  <uses-policies>  
  4.    <limit-password />  
  5.         <watch-login />  
  6.         <reset-password />  
  7.         <force-lock />  
  8.         <wipe-data />  
  9.    </uses-policies>  
  10. </device-admin></span>  

<uses-policies></uses-policies>中间的内容是可以不要的。

因为这部分是系统给的提示语,而我们在自己做程序的时候,可以输入自己想写的内容。

第二步,广播服务类的JAVA代码,重写一些必要的实现函数:

广播类deviceAdminReceiver 继承DeviceAdminReceiver

  1. package cn.etzmico;  
  2.   
  3. import android.app.admin.DeviceAdminReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.SharedPreferences;  
  7. import android.widget.Toast;  
  8.   
  9. public class deviceAdminReceiver extends DeviceAdminReceiver {  
  10.   
  11.     /** 
  12.      * 获取设备存储的数值 
  13.      *  
  14.      * @param context 
  15.      * @return 
  16.      */  
  17.     public static SharedPreferences getDevicePreference(Context context) {  
  18.         return context.getSharedPreferences(  
  19.                 DeviceAdminReceiver.class.getName(), 0);  
  20.     }  
  21.   
  22.     // 密码的特点   
  23.     public static String PREF_PASSWORD_QUALITY = "password_quality";  
  24.     // 密码的长度   
  25.     public static String PREF_PASSWORD_LENGTH = "password_length";  
  26.   
  27.     public static String PREF_MAX_FAILED_PW = "max_failed_pw";  
  28.   
  29.     void showToast(Context context, CharSequence text) {  
  30.         Toast.makeText(context, text, Toast.LENGTH_SHORT).show();  
  31.     }  
  32.   
  33.     @Override  
  34.     public void onEnabled(Context context, Intent intent) {  
  35.         // TODO Auto-generated method stub   
  36.         showToast(context, "设备管理:可用");  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onDisabled(Context context, Intent intent) {  
  41.         // TODO Auto-generated method stub   
  42.         showToast(context, "设备管理:不可用");  
  43.     }  
  44.   
  45.     @Override  
  46.     public CharSequence onDisableRequested(Context context, Intent intent) {  
  47.         // TODO Auto-generated method stub   
  48.         return "这是一个可选的消息,警告有关禁止用户的请求";  
  49.     }  
  50.   
  51.     @Override  
  52.     public void onPasswordChanged(Context context, Intent intent) {  
  53.         // TODO Auto-generated method stub   
  54.         showToast(context, "设备管理:密码己经改变");  
  55.     }  
  56.   
  57.     @Override  
  58.     public void onPasswordFailed(Context context, Intent intent) {  
  59.         // TODO Auto-generated method stub   
  60.         showToast(context, "设备管理:改变密码失败");  
  61.     }  
  62.   
  63.     @Override  
  64.     public void onPasswordSucceeded(Context context, Intent intent) {  
  65.         // TODO Auto-generated method stub   
  66.         showToast(context, "设备管理:改变密码成功");  
  67.     }  
  68.   
  69. }  

第三步,也就是最关键的操作代码了

激活相关

  1. Intent intent = new Intent(  
  2.         DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
  3. intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,  
  4.         mDeviceComponentName);  
  5. intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,  
  6.         "(自定义区域2)");  
  7. startActivityForResult(intent, RESULT_ENABLE);  

代码中的自定义区域2是可以输入一些自己想说的话,和广播类中的android:description="@string/description"一样。

这个是系统提供的两个自定义区域。

  1. <string name="description">(可自定义区域1)</string>  

锁屏相关

  1. mDPM.lockNow();  

锁屏操作,由于是模拟器不能做到真正错屏,只能停到初始模拟器进来需要解锁的状态,屏幕不会变暗。

设置屏幕灯光变暗时间相关

  1. long timeout = 1000L * Long.parseLong(et.getText().toString());  
  2. mDPM.setMaximumTimeToLock(mDeviceComponentName, timeout);  
  3. mDPM.wipeData(0);  

et是定义的一个EditText,用于进行时间的输入

屏幕变暗最小时间为5秒

恢复出厂设置相关

  1. mDPM.wipeData(0);  

企鹅博客
  • 本文由 发表于 2019年8月31日 07:32:47
  • 转载请务必保留本文链接:https://www.qieseo.com/171996.html

发表评论