Android极速开发之设备管理器

继续来总结一些常用封装。

欢迎留言、转发、打赏

项目源码参考地址 点我点我–欢迎Start

  • 何为设备管理器
  • 激活设备管理器能做些什么
  • 如何激活设备管理器

Android 2.2 SDK提供了一个可管理和操作设备的API叫DevicePolicyManager(这是设备管理的主类),使用这个API你可以接管手机的应用权限,对手机做出很重要很多大胆的操作(温馨提示:数据无价,谨慎操作),比如设置锁屏方式、恢复出厂设置、设置密码、强制清除密码,修改密码等操作。

DeviceAdminReceiver

该类继承自 BroadcastReceiver 。 从源码可以看到,其实就是实现了一个OnReceive方法,该方法中根据不同的Action,执行相应的操作。 比如,如果激活成功,那么Action就是ACTION_DEVICE_ADMIN_ENABLED, 据此调用 onEnabled 方法。下面会有继承DeviceAdminReceiver方法的实现。

到底如何激活设备管理器呢?

1.申请设备管理器权限,注册权限监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--设备管理-->
<receiver
android:name=".demo.DeviceReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
<!--设备管理 END-->

2.创建xml文件夹添加device_admin.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<device-admin
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<!-- 限制密码类型 -->
<watch-login />
<!-- 监控登录尝试 -->
<reset-password />
<!-- 重置密码 -->
<force-lock />
<!--锁屏 -->
<wipe-data />
<!-- 恢复出厂设置 -->
</uses-policies>
</device-admin>

3.常用方法封装

该方法使用的双重锁定单例模式 私有构造方法中获取设备管理服务并实例化一个DeviceReceiver继承自 DeviceAdminReceiver具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
public class DeviceMethod {
private static DeviceMethod mDeviceMethod;
private DevicePolicyManager devicePolicyManager;
private ComponentName componentName;
private Context mContext;
private DeviceMethod (Context context){
mContext=context;
//获取设备管理服务
devicePolicyManager=(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
//DeviceReceiver 继承自 DeviceAdminReceiver
componentName=new ComponentName(context, DeviceReceiver.class);
}
public static DeviceMethod getInstance(Context context){
if (mDeviceMethod==null) {
synchronized (DeviceMethod.class) {
if (mDeviceMethod==null) {
mDeviceMethod=new DeviceMethod(context);
}
}
}
return mDeviceMethod;
}
// 激活程序
public void onActivate() {
Toast.makeText(mContext, "激活", Toast.LENGTH_SHORT).show();
//判断是否激活 如果没有就启动激活设备
if (!devicePolicyManager.isAdminActive(componentName)) {
Intent intent = new Intent(
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "提示文字");
mContext.startActivity(intent);
}else {
Toast.makeText(mContext, "设备已经激活,请勿重复激活", Toast.LENGTH_SHORT).show();
}
}
/**
* 移除程序 如果不移除程序 APP无法被卸载
*/
public void onRemoveActivate() {
devicePolicyManager.removeActiveAdmin(componentName);
}
/**
* 设置解锁方式 不需要激活就可以运行
*/
public void startLockMethod() {
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
mContext.startActivity(intent);
}
/**
* 设置解锁方式
*/
public void setLockMethod() {
// PASSWORD_QUALITY_ALPHABETIC
// 用户输入的密码必须要有字母(或者其他字符)。
// PASSWORD_QUALITY_ALPHANUMERIC
// 用户输入的密码必须要有字母和数字。
// PASSWORD_QUALITY_NUMERIC
// 用户输入的密码必须要有数字
// PASSWORD_QUALITY_SOMETHING
// 由设计人员决定的。
// PASSWORD_QUALITY_UNSPECIFIED
// 对密码没有要求。
if (devicePolicyManager.isAdminActive(componentName)) {
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
devicePolicyManager.setPasswordQuality(componentName,
DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
mContext.startActivity(intent);
}else {
Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();
}
}
/**
* 立刻锁屏
*/
public void LockNow() {
if (devicePolicyManager.isAdminActive(componentName)) {
devicePolicyManager.lockNow();
}else {
Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();
}
}
/**
* 设置多长时间后锁屏
* @param time
*/
public void LockByTime(long time) {
if (devicePolicyManager.isAdminActive(componentName)) {
devicePolicyManager.setMaximumTimeToLock(componentName, time);
}else {
Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();
}
}
/**
* 恢复出厂设置
*/
public void WipeData() {
if (devicePolicyManager.isAdminActive(componentName)) {
devicePolicyManager.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);
}else {
Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();
}
}
/**
* 设置密码锁
* @param password
*/
public void setPassword(String password) {
if (devicePolicyManager.isAdminActive(componentName)) {
devicePolicyManager.resetPassword(password,
DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
}else {
Toast.makeText(mContext, "请先激活设备", Toast.LENGTH_SHORT).show();
}
}
}

遗留问题 弹出激活界面点击取消 如何监听

有好的解决方案欢迎留言(目前我想到的可以尝试使用模拟用户点击【之前很火🔥的抢微信红包插件】)

以下是设备管理器操作的广播监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class DeviceReceiver extends DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
// 设备管理:可用
Toast.makeText(context, "设备管理:可用", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisabled(final Context context, Intent intent) {
// 设备管理:不可用
Toast.makeText(context, "设备管理:不可用", Toast.LENGTH_SHORT).show();
//如果取消了激活就再次提示激活
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
DeviceMethod.getInstance(context.getApplicationContext()).onActivate();
}
}, 3000);
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
/* // 这里处理 不可编辑设备。这里可以造成死机状态
Intent intent2 = new Intent(context, NoticeSetting.class);
intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
context.stopService(intent);// 是否可以停止*/
return "这是一个可选的消息,警告有关禁止用户的请求";
}
@Override
public void onPasswordChanged(Context context, Intent intent) {
// 设备管理:密码己经改变
Toast.makeText(context, "设备管理:密码己经改变", Toast.LENGTH_SHORT).show();
}
@Override
public void onPasswordFailed(Context context, Intent intent) {
// 设备管理:改变密码失败
Toast.makeText(context, "设备管理:改变密码失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onPasswordSucceeded(Context context, Intent intent) {
// 设备管理:改变密码成功
Toast.makeText(context, "设备管理:改变密码成功", Toast.LENGTH_SHORT).show();
}
}

4.一些栗子

  • 激活设备管理器
  • 取消激活设备管理器
  • 设置解锁方式
  • 立刻锁屏
  • 设置N秒后锁屏
  • 恢复出厂设置
  • 设置密码锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 激活程序
public void OnActivate(View v) {
DeviceMethod.getInstance(this).onActivate();
}
// 移除程序 如果不移除程序 APP无法被卸载
public void OnRemoveActivate(View v) {
DeviceMethod.getInstance(this).onRemoveActivate();
}
// 设置解锁方式 不需要激活就可以运行
public void btnszmm(View v) {
DeviceMethod.getInstance(this).startLockMethod();
}
// 设置解锁方式
public void btnmm(View v) {
DeviceMethod.getInstance(this).setLockMethod();
}
// 立刻锁屏
public void btnlock(View v) {
DeviceMethod.getInstance(this).LockNow();
}
// 设置5秒后锁屏
public void btnlocktime(View v) {
DeviceMethod.getInstance(this).LockByTime(5000);
}
// 恢复出厂设置
public void btnwipe(View v) {
DeviceMethod.getInstance(this).WipeData();
}
// 设置密码锁
public void setPassword(View v) {
DeviceMethod.getInstance(this).setPassword("1234");
}

欢迎留言、转发、打赏
项目源码参考地址 点我点我–欢迎Start

Javen wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!