本文通过示例演示Android Device Policy管理的实现。
1.示例基本操作图
上图是本示例的主界面,通过应用程序来实现设备管理,本示例实现密码设置管理。
1.1 通过点击“启动设备管理器”按钮来激活设备管理
应用程序用通知设备管理启用,用户点击激活,应用程序具备设备管理能力。
1.2 通过点击“设置密码规则”按钮来设置锁屏密码的限制规则,要使用该策略需要在设备管理的使用策略列表中添加limit-password.
示例中调用了设置新密码的ACTION(DevicePolicyManager.ACTION_SET_NEW_PASSWORD),通过设置后,看以看到屏幕锁屏需要密码。
1.3 通过点击“修改密码”按钮则可以将文本框中的内容作为锁屏密码,该步骤可以通过程序完成。
调用DevicePolicyManager的重置密码方法(resetPassword),即可在应用程序中对锁屏密码进行重置。
2. 具体实现
实现上述整个示例需要:
a.界面布局;实际应用中根据具体情况而定
b.DevicePolicyManager类的具体使用
c.DeviceAdminReceiver类的子类话,来实现具体广播事件的处理
d.AndroidManifest.xml文件中广播接收类的配置
c.应用程序中需要的设备管理策略列表
注:本示例代码使用了Butterknife框架。
2.1 示例程序界面(layout/activity_device_admin.xml)
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
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:background
=
"#f7f1f1"
android:orientation
=
"vertical"
android:padding
=
"15dp"
>
<
LinearLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:layout_gravity
=
"center_horizontal"
android:orientation
=
"horizontal"
>
<
EditText
android:id
=
"@+id/pwd_editText"
android:layout_width
=
"0dp"
android:layout_height
=
"wrap_content"
android:layout_margin
=
"10dp"
android:layout_weight
=
"3"
android:hint
=
"6位数字"
android:textColor
=
"@android:color/black"
/>
<
Button
android:id
=
"@+id/modify_pwd_button"
android:layout_width
=
"0dp"
android:layout_height
=
"wrap_content"
android:layout_margin
=
"10dp"
android:layout_weight
=
"1.5"
android:text
=
"修改密码"
/>
</
LinearLayout
>
<
Button
android:id
=
"@+id/pwd_rule_set_button"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:text
=
"设置密码规则"
/>
<
Button
android:id
=
"@+id/device_admin_button"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:text
=
"启用设备管理"
/>
</
LinearLayout
>
|
2.2 Activity类和自定义的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
|
package
secondriver.sdk.activity;
import
android.app.Activity;
import
android.app.admin.DeviceAdminReceiver;
import
android.app.admin.DevicePolicyManager;
import
android.content.ComponentName;
import
android.content.Context;
import
android.content.Intent;
import
android.os.Bundle;
import
android.widget.Button;
import
android.widget.EditText;
import
android.widget.Toast;
import
butterknife.Bind;
import
butterknife.ButterKnife;
import
butterknife.OnClick;
import
secondriver.sdk.R;
/**
* Author : secondriver
* Created : 2015/11/27
*/
public
class
DeviceAdminActivity
extends
Activity {
@Bind
(R.id.pwd_editText)
public
EditText pwdEditText;
private
DevicePolicyManager mDevicePolicyManager;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_admin);
ButterKnife.bind(
this
);
mDevicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
}
//单击启用设备管理按钮
@OnClick
(R.id.device_admin_button)
public
void
onClickDeviceButton(Button button) {
Intent intent =
new
Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
new
ComponentName(
this
, MyDeviceAdminReceiver.
class
));
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
"启动设备管理器"
);
startActivityForResult(intent,
1
);
}
//单击设置密码规则按钮
@OnClick
(R.id.pwd_rule_set_button)
public
void
onClickPwdRuleSetButton(Button button) {
Intent intent =
new
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivityForResult(intent,
2
);
}
//单击修改密码按钮
@OnClick
(R.id.modify_pwd_button)
public
void
onClickModifyPwdButton(Button button) {
String pwd = pwdEditText.getText().toString();
ComponentName receiver =
new
ComponentName(
this
, MyDeviceAdminReceiver.
class
);
boolean
active = mDevicePolicyManager.isAdminActive(receiver);
if
(active) {
boolean
rs = mDevicePolicyManager.resetPassword(pwd, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
if
(rs) {
Toast.makeText(
this
,
"密码修改成功"
, Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(
this
,
"密码修改失败"
, Toast.LENGTH_SHORT).show();
}
}
else
{
Toast.makeText(
this
,
"没有Active Admin"
, Toast.LENGTH_SHORT).show();
}
}
@Override
protected
void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
switch
(requestCode) {
case
1
:
if
(resultCode == RESULT_OK) {
Toast.makeText(
this
,
"设备管理器开启成功"
, Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(
this
,
"设备管理器开启失败"
, Toast.LENGTH_SHORT).show();
}
break
;
case
2
:
if
(resultCode == RESULT_OK) {
Toast.makeText(
this
,
"密码规则设置成功"
, Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(
this
,
"密码规则设置失败"
, Toast.LENGTH_SHORT).show();
}
break
;
default
:
break
;
}
}
//自定义的设备管理广播接收类,可以重写DeviceAdminReceiver中的方法,来实现具体功能
public
static
class
MyDeviceAdminReceiver
extends
DeviceAdminReceiver {
/**
* 重写其中方法
* <p>
* More
*/
@Override
public
void
onDisabled(Context context, Intent intent) {
super
.onDisabled(context, intent);
//设备管理禁用
}
@Override
public
void
onEnabled(Context context, Intent intent) {
super
.onEnabled(context, intent);
//设备管理启用
}
}
}
|
2.3 配置设备管理接收者
1
2
3
4
5
6
7
8
9
|
<
activity
android:name
=
".activity.DeviceAdminActivity"
/>
<
receiver
android:name
=
".activity.DeviceAdminActivity$MyDeviceAdminReceiver"
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"
/>
</
intent-filter
>
</
receiver
>
|
xml/device_admin内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?
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
/>
<!--禁用相机;禁止使用所有设备摄像头-->
<
disable-camera
/>
<!--加密数据;对存储的应用数据进行加密-->
<
encrypted-storage
/>
<!--密码过期;强制用户更改屏幕锁密码的频率-->
<
expire-password
/>
</
uses-policies
>
</
device-admin
>
|
示例生成apk,该应用具体了设备管理的功能。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1718579,如需转载请自行联系原作者