[Android学习笔记七] 设备管理服务示例开发

  本文通过示例演示Android Device Policy管理的实现。


   1.示例基本操作图

   

     [Android学习笔记七] 设备管理服务示例开发

     上图是本示例的主界面,通过应用程序来实现设备管理,本示例实现密码设置管理。

     

     1.1 通过点击“启动设备管理器”按钮来激活设备管理

   

     [Android学习笔记七] 设备管理服务示例开发      

      应用程序用通知设备管理启用,用户点击激活,应用程序具备设备管理能力。


    1.2  通过点击“设置密码规则”按钮来设置锁屏密码的限制规则,要使用该策略需要在设备管理的使用策略列表中添加limit-password.

   

     

     [Android学习笔记七] 设备管理服务示例开发[Android学习笔记七] 设备管理服务示例开发[Android学习笔记七] 设备管理服务示例开发


     示例中调用了设置新密码的ACTION(DevicePolicyManager.ACTION_SET_NEW_PASSWORD),通过设置后,看以看到屏幕锁屏需要密码。  

  

    1.3 通过点击“修改密码”按钮则可以将文本框中的内容作为锁屏密码,该步骤可以通过程序完成。

   

    [Android学习笔记七] 设备管理服务示例开发


    调用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,如需转载请自行联系原作者

上一篇:21. Kotlin学习笔记 (一) 基本语法


下一篇:[Android]对MVC和MVP的总结