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

简介:

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


   1.示例基本操作图

   

     wKiom1ZdXWuh3pLzAADs8ui0CK4903.png

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

     

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

   

     wKiom1ZdXkOC_Tt0AAExp-CnAww052.png      

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


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

   

     

     wKioL1ZdXzHDZTq0AAC_1sgm19Y095.pngwKiom1ZdXs3zEBoTAAEf044QB-4443.pngwKiom1ZdXtCQrB4dAAFF2tcY6NY804.png


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

  

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

   

    wKiom1ZdYALAigjDAAFtasmTyCs591.png


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

相关文章
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
27 1
|
1月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
20天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
1月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
20天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
45 14
|
23天前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
21天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
31 5
|
20天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
21天前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。