安卓开发DevicePolicyManager.reset1password安卓()

     
来自eoeAndroid wiki
原文链接:
翻译者:Cecho
翻译时间:
Android 2.2 通过提供Android设备管理API来向企业级应用提供支持。设备管理API在操作系统级别提供设备管理特性。这些API使你可以创建那些在企业环境中对安全敏感的应用,在企业环境中IT专家要对员工的设备进行全面的控制(译者:信息安全很重要啊,私自泄漏要负法律责任的)。例如,内置的Android邮件应用增加了一些新的API来提高对Exchange的支持。通过邮件程序,Exchange管理员可以加强设备间的密码安全策略--包括字母数字密码或者数字PIN。管理员还可以远程擦除(也就是恢复出厂设置)丢失或者被偷的手持终端。Exchange用户还可以同步他们的电邮和日历数据。
这份文档是为了那些要在Android设备上提供企业解决方案的开发者准备的。这里讨论了设备管理API为了加强员工们使用的Android设备的安全性而提供的众多特性。
可能会用到设备管理API的应用程序:
电子邮件客户端。
远程删除数据的安全应用程序。
设备管理服务和应用程序。
你使用这些设备管理API来编写安装在用户设备上的设备管理程序。设备管理程序加强了期望的策略。下面是它如何起作用的:
一个系统管理员编写一个增强远端或者本地设备的安全策略。这些策略可以被硬编码到应用里面或者动态地从第三方服务器获取。
应用要被安装在用户设备上的。但是Android现在还没有提供自动化供应解决方案。系统管理员可以通过下面这些途径向用户发行应用:
Google Play
其他应用商店
其他方式,比如邮件或者网站
系统会提示用户开启设备管理程序。这一切,如何以及何时发生取决于应用的设计。
一旦用户启用了设备管理程序,就要受制于它的策略。遵守这些策略会带来好处,比如访问敏感的系统和数据。
如果用户不启用管理程序,它还在设备上,但是出于非激活状态。用户就不会受制于它的策略,当然也就不会得倒好处--例如,用户无法同步数据。
如果用户没有遵循安全策略(例如,设置了不符合要求的密码),应用就会决定如何处理出现的情况。然而,一般也就是让用户同步数据。
如果设备尝试连接某个服务器,而这个服务器的安全策略不被设备管理API支持,连接就不会建立。设备管理API目前不允许部分匹配。换句话说,如果一个设备(比如,遗留下来的设备)没有支持全部的策略,这个设备就无法连接。
如果一个设备包含多个开启的管理程序,最强的策略就会被执行。应为没有办法确定一个特定的管理程序。
要卸载设备上的管理程序,首先需要用户以管理员的身份取消注册。
在企业环境中,通常是雇员遵守一套严格的设备管理策略。Android的设备管理API支持Table 1 中列举的策略。记住,设备管理API目前只支持锁屏密码。
表格1.设备管理API支持的策略
要求设备询问PIN或者密码
最小密码长度
设置密码的最小字符数。例如,你可以要求PIN或者密码最短要有6个字符
数字和字符混合模式
要求密码是由字符和数字组合而成的。密码可以包含符号字符。
启用复杂密码模式
要求密码必须包含至少一个字母、数字、特殊字符。这个特性是由Android 3.0 引入的。
最少字母数的限制
对所有管理员或者某个特定用户要求密码中最少要有多少个字母。这个特性是由Android 3.0 引入的。
最少小写字母数的限制
对所有管理员或者某个特定用户要求密码中最少要有多少个小写字母。这个特性是由Android 3.0 引入的。
最少非字母字符数的限制
对所有管理员或者某个特定用户要求密码中最少要有多少个非字母字符。这个特性是由Android 3.0 引入的。
最少数字字符数的限制
对所有管理员或者某个特定用户要求密码中最少要有多少个数字字符。这个特性是由Android 3.0 引入的。
最少符号字符数的限制
对所有管理员或者某个特定用户要求密码中最少要有多少个符号字符。这个特性是由Android 3.0 引入的。
最少大写字母字符数的限制
对所有管理员或者某个特定用户要求密码中最少要有多少个大写字母字符。这个特性是由Android 3.0 引入的。
密码过期时间设置
密码何时失效。当管理员设置过期时间后,会以毫秒递增直到设置的时间。这个特性是由Android 3.0 引入的。
密码历史记录
这项策略可以避免用户使用以前用过的n个密码。它通常还是和
一起使用的。这个特性是由Android 3.0 引入的。
允许输入错误密码的次数
指明在设备擦除自身数据之前,用户可以输入错误密码的次数。设备管理API还允许管理员远程地使设备恢复出厂设置。这在设备丢失的情况下保护了设备的数据安全。
设置了用户没有触摸屏幕或者没有按键,设备锁屏要等待的时间。用户要重新使用设备就要输入PIN或者密码。它的值可以设置为1-60分钟。
在设备支持的情况下,指定要加密的存储位置。 这个特性是由Android 3.0 引入的。
禁用摄像头
说明摄像头要被禁用。要注意,这不是永久的禁用。摄像头可以在任何情况、时间下启用/禁用。这个特性是由Android 4.0 引入的。
除了支持上面列出来的策略外,设备管理API还允许你做下面的事情:
提示用户设置新密码
擦除数据(也就是,恢复出厂设置)
本篇wiki所使用的例子是基于SDK示例程序中的示例程序创建的。想要获取和安装SDK示例,请看这里。这还有。
这个程序向你提供了展示设备管理特性的例子。它向用户展现了一个用户界面并允许用户开启设备管理程序。一旦用户启动程序,他们就可以用界面上的按钮来做来做下面的事情:
设置密码的质量
说明对用户密码的要求。比如,密码包含的最小长度、密码中最少要有几个数字字符等等。
设置密码。如果输入的密码不符合特定的策略,系统就会提示出错。
设置数据被擦除(恢复出厂设置)前,允许的输入错误的次数。
设置密码过期时间。
设置记录的密码数量。这可以避免用户使用旧的密码。
在设备支持的情况下,可以设定加密存储的区域。
设置设备上锁的时间。
使设备立即上锁。
擦除设备数据(恢复出厂设置)
禁用摄像头
图片1.示例程序截图
系统管理员可以使用设备管理API创建一个设备管理程序本地\远程地对设备的安全策略进行加强。这一小节总结了必要的步奏。
要使用设备管理API,程序的Manifest文件要包含下面的内容:
的子类包含以下内容.
intent 对象的能力,在Manifest文件中由 intent filter 完成。
在元数据中使用安全策略的声明。
这是一段设备管理程序Manifest文件的摘录:
&activity android:name=&.app.DeviceAdminSample&
android:label=&@string/activity_sample_device_admin&&
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.SAMPLE_CODE& /&
&/intent-filter&
&/activity&
&receiver android:name=&.app.DeviceAdminSample$DeviceAdminSampleReceiver&
android:label=&@string/sample_device_admin&
android:description=&@string/sample_device_admin_description&
android:permission=&android.permission.BIND_DEVICE_ADMIN&&
&meta-data android:name=&android.app.device_admin&
android:resource=&@xml/device_admin_sample& /&
&intent-filter&
&action android:name=&android.app.action.DEVICE_ADMIN_ENABLED& /&
&/intent-filter&
&/receiver&
下面属性所应用的字符串资源在项目的ApiDemos/res/values/strings.xml中。关于资源的更多信息,看这里
android:label="@string/activity_sample_device_admin"为activity 引用了用户可读标签。
android:label="@string/sample_device_admin"为permission引用了用户可读标签。
android:description="@string/sample_device_admin_description"为permission引用了用户可读标签。描述信息一般都比标签的内容长得多。
android:permission="android.permission.BIND_DEVICE_ADMIN"是一个 的子类必须要获得的权限,来确保只有系统可以和接受者交互(没有程序可以保证这个权限)。这就可以阻止其他应用滥用你的系统管理程序。
android.app.action.DEVICE_ADMIN_ENABLED 是一个 的子类必须处理的动作,如果它要被允许管理设备。在程序启动时,它就已经被设置到接收者了。你的代码要重载 方法。同时还要具有权限,以免被其他程序滥用。
一旦用户启动了程序,接受者也就获得了响应系统广播事件的权限。当合适的事件发生,程序就会应用对应的策略。例如,如果用户在设置信密码时,输入的内容不符合安全策略,程序会提示用户重新选择一个符合要求的密码。
android:resource="@xml/device_admin_sample"声明了在元数据中使用的安全策略,元数据为设备管理原提供了特定的信息。元数据由 类来解析。下面是device_admin_sample.xml的内容:
&device-admin xmlns:android=&/apk/res/android&&
&uses-policies&
&limit-password /&
&watch-login /&
&reset-password /&
&force-lock /&
&wipe-data /&
&expire-password /&
&encrypted-storage /&
&disable-camera /&
&/uses-policies&
&/device-admin&
在你设计你的设备管理程序时,并不需要包括所有的安全策略,按需定制即可。
关于Manifest文件的更多信息,请到。
设备管理API包括下面这些类:
完成设备管理组件的基类。这个类提供了一个解释系统发送的原始Intent动作的方便途径。你的设备管理程序,必须包含一个它的子类。
这个类负责管理在设备上执行的安全策略。它的大多数客户端要发布一个已经被当前用户启用的。为最少一个实例管理安全策略。
这个类是用来为系统管理组件指定元数据的。
要创建一个设备管理程序,就要实现一个继承的类。包含了一系列的回调函数,这些回调函数会在具体的事件发生时被调用。
在例子程序里,我们只是简单地显示了一个,来做为对相应事件的应答。例如:
public class DeviceAdminSample extends DeviceAdminReceiver {
void showToast( context,
msg) {
status = context.getString(R.string.admin_receiver_status, msg);
Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
public void onEnabled( context, Intent intent) {
showToast(context, context.getString(R.string.admin_receiver_status_enabled));
public CharSequence onDisableRequested( context, Intent intent) {
return context.getString(R.string.admin_receiver_status_disable_warning);
public void onDisabled( context, Intent intent) {
showToast(context, context.getString(R.string.admin_receiver_status_disabled));
public void onPasswordChanged( context, Intent intent) {
showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
用户启用程序,是设备管理程序要处理最重要的事件之一。用户必须明确启用设备管理程序才能使安全策略在设备上执行。如果用户选择不启用的话,那么安全策略就不会被执行,用户也就无法利用我们的设备管理程序。
应用程序被启用的过程是,用户的动作出发了 Intent。在这个程序里,它发生在用户点击了 Enable Admin 选择框。
当用户点击了Enable Admin 选择框,设备就会提示用户已经启用了设备管理程序,如图2,所示:
图2. 实例:启用应用程序
下面就是当用户点击了 Enable Admin 选择框要执行的代码。效果是触发了回调函数。当用户改变的值时,就会调用这个回调函数。如果用户启用程序,界面就会提示用户正在启用程序,就像图2.否则就是禁止程序:
public boolean onPreferenceChange(Preference preference,
newValue) {
if (super.onPreferenceChange(preference, newValue)) {
return true;
boolean value = () newV
if (preference == mEnableCheckbox) {
if (value != mAdminActive) {
if (value) {
// Launch the activity to have the user enable our admin.
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
mActivity.getString(R.string.add_admin_extra_app_text));
startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
// return false - don't update checkbox until we're really active
return false;
} else {
mDPM.removeActiveAdmin(mDeviceAdminSample);
enableDeviceCapabilitiesArea(false);
mAdminActive = false;
} else if (preference == mDisableCameraCheckbox) {
mDPM.setCameraDisabled(mDeviceAdminSample, value);
return true;
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample)说明了mDeviceAdminSample是目标策略(是一个组件)。这些代码会调用图2的界面,让用户选择是否添加系统管理员。
当程序要执行一个操作,它要确定管理程序是否已经被启用了。实现的方法就是使用的方法。要注意的是,的方法需要一个类型的参数。
DevicePolicyManager mDPM;
private boolean isActiveAdmin() {
return mDPM.isAdminActive(mDeviceAdminSample);
是一个用来管理设备上所执行的策略的公共类。为一个或多个类的实例管理策略。
你可以这样获得的一个实例:
DevicePolicyManager mDPM =
(DevicePolicyManager)getSystemService(.DEVICE_POLICY_SERVICE);
这一节描述了怎样用执行管理任务:
设备锁定策略
指定数据擦除
设置密码策略
包含了一些用来设置和执行设备密码策略的API。在设备管理API中,密码只是用来解锁屏幕。本小节描述了密码相关的普通任务。
为设备设置密码
这段代码显示一个界面提示用户设置密码:
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
设置密码的强度
密码的强度可以由 中的常量来设置:
用户输入的密码必须要有字母(或者其他字符)。
用户输入的密码必须要有字母和数字。
用户输入的密码必须要有数字
用户输入的密码必须要有至少一个数字、字母、特殊字符。
由设计人员决定的。
对密码没有要求。
例如,你应该这样设置密码策略来要求一个数字的密码:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
mDPM.setPasswordQuality(mDeviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
设置对密码内容的要求
从 Android 3.0开始,就提供了一些能很好调节密码内容的方法。例如,你可以要求密码必须有n个大写字母。下面这些就是提供功能的方法:
例如下面的片段就设置密码要有最少两个大写字母:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
int pwMinUppercase = 2;
mDPM.setPasswordMinimumUpperCase(mDeviceAdminSample, pwMinUppercase);
设置密码最小长度
你可以指定密码的最小长度。例如:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
mDPM.setPasswordMinimumLength(mDeviceAdminSample, pwLength);
设置密码最多错误输入次数
你可以设置允许密码输入错误的最大次数,超过这个次数设备就要擦除数据(恢复出厂设置)。例如:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
int maxFailedPw;
mDPM.setMaximumFailedPasswordsForWipe(mDeviceAdminSample, maxFailedPw);
设置密码过期时间
从 Android 3.0开始,你可以使用方法设置密码何时失效,当设置完成系统会以毫秒为单位倒计时。例如:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
mDPM.setPasswordExpirationTimeout(mDeviceAdminSample, pwExpiration);
对密码的历史记录进行限制
从 Android 3.0开始,你可以使用限制用户使用的密码要多久不能重复,这个方法有一个length参数,用来设置要记录密码的个数。
当这项策略激活了,用户就不能使用所设定范围内的旧密码当做新的密码来使用。这就防止了用户一直使用一个密码。这个策略通常与一起使用,来使用户过一段时间就换一个新的密码。
例如,下面的代码可以防止用户使用最近使用的五个密码:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
int pwHistoryLength = 5;
mDPM.setPasswordHistoryLength(mDeviceAdminSample, pwHistoryLength);
你可以设置用户多长时间没有动作,就把设备锁住。例如:
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
long timeMs = 1000L*.parseLong(mTimeout.getText().toString());
mDPM.setMaximumTimeToLock(mDeviceAdminSample, timeMs);
你还可以使设备立即锁住:
DevicePolicyManager mDPM;
mDPM.lockNow();
你可以使用的方法使设备恢复出厂设置。这在设备被偷或者丢失的情况下非常有用。通常,在做出要擦除设备的决定时,都是达到了某一条件。例如,你可以使用 setMaximumFailedPasswordsForWipe()来是设备在用户输入密码错误固定次数之后擦除设备数据。
你要这样做:
DevicePolicyManager mDPM;
mDPM.wipeData(0);
方法的参数是一个选项的位掩码,这里暂时必须为0;
禁用摄像头
从 Android 4.0开始,你可以禁用摄像头。注意这不是永久的禁用。摄像头可以动态的禁用/启用在不同的上下文、时间等待。
你使用 setCameraDisabled()来设置摄像头是否被禁用。例如,下面的代码就根据选择框的状态来决定摄像头是否被禁用:
private CheckBoxPreference mDisableCameraC
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
mDPM.setCameraDisabled(mDeviceAdminSample, mDisableCameraCheckbox.isChecked());
从 Android 3.0开始,你可以使用 setStorageEncryption() 方法,来设置加密存储,如果设备支持的话。
DevicePolicyManager mDPM;
ComponentName mDeviceAdminS
mDPM.setStorageEncryption(mDeviceAdminSample, true);
请阅读来获取完整的加密存储的例子
Android - 安卓18231人阅读
Android手机一般不用时,都会通过电源键来锁定屏幕同时关闭屏幕灯。
其实从API Level 8 (也就是Android 2.2) 开始, Android提供了DevicePolicyManager类, 可以让你的应用程序也能执行屏幕锁定等操作。
锁定效果:
下面我们来看一下具体如何操作。 要让自己的应用实现该屏幕锁定,主要需要用到以下几个类:
DevicePolicyManager
这是设备管理的主类。通过它可以实现屏幕锁定、屏幕亮度调节、出厂设置等功能。
DeviceAdminReceiver
&该类继承自&BroadcastReceiver&。 从源码可以看到,其实就是实现了一个OnReceive方法,该方法中根据不同的Action,执行相应的操作。 比如,如果激活成功,那么Action就是ACTION_DEVICE_ADMIN_ENABLED, 据此调用&onEnabled 方法。
系统源码:
* Intercept standard device administrator broadcasts.
Implementations
* should not
it is better to implement the
* convenience callbacks for each action.
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_PASSWORD_CHANGED.equals(action)) {
onPasswordChanged(context, intent);
} else if (ACTION_PASSWORD_FAILED.equals(action)) {
onPasswordFailed(context, intent);
} else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) {
onPasswordSucceeded(context, intent);
} else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) {
onEnabled(context, intent);
} else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
CharSequence res = onDisableRequested(context, intent);
if (res != null) {
Bundle extras = getResultExtras(true);
extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
} else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
onDisabled(context, intent);
DeviceAdminInfo
定义设备管理类的&meta 信息。 什么意思呢? 就是定义可用的权限。define&policy that this device admin can use。
比如&DeviceAdminReceiver.USES_POLICY_FORCE_LOCK , 这个就是本次要用的"强制锁定屏幕"的权限. 不过这些权限一般都直接通过XML文件来定义。 稍后你就会看到。
下面我们就来看下如何实现屏幕锁定。
注意,此处讲的屏幕锁定, 其实还是调用的系统的锁定方式。
在 "设置" - &位置与安全& - "更改屏幕锁定" 中可以设置锁定方式,一共有四种:
2. 图案锁 (就是九宫图)
你的手机设置了哪个锁, 调用这个API时就会显示哪个锁 !
(锁定类型设置画面)
第一步: 写一个布局文件,该布局上有四个按钮, 分别对应 "激活设备管理权限" 、 "禁用设备管理权限"、"系统锁"、"自定义锁"。&
其中"自定义锁"在下一篇博文中讲。本次暂时不用。
布局文件如下:
&?xml version="1.0" encoding="utf-8"?&
&RelativeLayout
xmlns:android="/apk/res/android"
android:gravity="center"
android:id="@+id/rlTextDescBlock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"&
&LinearLayout
android:id="@+id/layout1"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30px"&
android:id="@+id/active"
android:textSize="14.0sp"
android:textStyle="bold"
android:textColor="#ff5779a7"
android:background="@drawable/detail_redirect_button_bg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:text="激活"
android:layout_weight="1.0" /&
android:id="@+id/unactive"
android:textSize="14.0sp"
android:textStyle="bold"
android:textColor="#ff5779a7"
android:background="@drawable/detail_comment_button_bg"
android:paddingRight="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10.0dip"
android:text="禁用"
android:layout_weight="1.0" /&
&/LinearLayout&
&LinearLayout
android:layout_below="@id/layout1"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30px"&
android:id="@+id/syslock"
android:textSize="14.0sp"
android:textStyle="bold"
android:textColor="#ff5779a7"
android:background="@drawable/detail_redirect_button_bg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:text="系统锁屏"
android:layout_weight="1.0" /&
android:id="@+id/custlock"
android:textSize="14.0sp"
android:textStyle="bold"
android:textColor="#ff5779a7"
android:background="@drawable/detail_comment_button_bg"
android:paddingRight="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10.0dip"
android:text="自定义锁屏"
android:layout_weight="1.0" /&
&/LinearLayout&
&/RelativeLayout&&
下面就对应的一个个实现功能。
1. "激活" 功能。
STEP1:初始化设备管理需要的几个类:
//获取设备管理服务
policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
//AdminReceiver 继承自 DeviceAdminReceiver
componentName = new ComponentName(this, AdminReceiver.class);
其中:&AdminReceiver 类的代码如下:
package com.yfz.
import com.yfz.log.L
import android.app.admin.DeviceAdminI
import android.app.admin.DeviceAdminR
import android.app.admin.DevicePolicyM
import ponentN
import android.content.C
import android.content.I
import android.content.pm.ResolveI
import android.os.IB
import android.widget.T
public class AdminReceiver extends DeviceAdminReceiver {
public DevicePolicyManager getManager(Context context) {
Logger.d("------" + "getManager" + "------");
return super.getManager(context);
public ComponentName getWho(Context context) {
Logger.d("------" + "getWho" + "------");
return super.getWho(context);
public void onDisabled(Context context, Intent intent) {
Logger.d("------" + "onDisabled" + "------");
Toast.makeText(context, "禁用设备管理", Toast.LENGTH_SHORT).show();
super.onDisabled(context, intent);
public CharSequence onDisableRequested(Context context, Intent intent) {
Logger.d("------" + "onDisableRequested" + "------");
return super.onDisableRequested(context, intent);
public void onEnabled(Context context, Intent intent) {
Logger.d("------" + "onEnabled" + "------");
Toast.makeText(context, "启动设备管理", Toast.LENGTH_SHORT).show();
super.onEnabled(context, intent);
public void onPasswordChanged(Context context, Intent intent) {
Logger.d("------" + "onPasswordChanged" + "------");
super.onPasswordChanged(context, intent);
public void onPasswordFailed(Context context, Intent intent) {
Logger.d("------" + "onPasswordFailed" + "------");
super.onPasswordFailed(context, intent);
public void onPasswordSucceeded(Context context, Intent intent) {
Logger.d("------" + "onPasswordSucceeded" + "------");
super.onPasswordSucceeded(context, intent);
public void onReceive(Context context, Intent intent) {
Logger.d("------" + "onReceive" + "------");
super.onReceive(context, intent);
public IBinder peekService(Context myContext, Intent service) {
Logger.d("------" + "peekService" + "------");
return super.peekService(myContext, service);
继承了DeviceAdminReceiver,没有做什么特别操作,仅仅在激动、禁用时输出一个提示消息。
同时,像普通Broadcast类一样,该类也需要在 &AndroidManifest.xml 文件中注册。
&!-- 设备管理 --&
&receiver android:name=".broadcast.AdminReceiver"
android:label="@string/device"
android:description="@string/device_des"
android:permission="android.permission.BIND_DEVICE_ADMIN"&
&meta-data android:name="android.app.device_admin"
android:resource="@xml/lock_screen" /&
&intent-filter&
android:name="android.app.action.DEVICE_ADMIN_ENABLED" /&
&/intent-filter&
&/receiver&&
android:permission="android.permission.BIND_DEVICE_ADMIN" 和
&intent-filter&
&action&android:name="android.app.action.DEVICE_ADMIN_ENABLED" /&
&/intent-filter&
是必须的。
android:resource="@xml/lock_screen" 对应的就是权限说明文件。
本次仅需要强制锁定权限。 如下:
&?xml version="1.0" encoding="UTF-8"?&
&device-admin
xmlns:android="/apk/res/android"&
&uses-policies&
&!-- 强行锁定 --&
&force-lock /&
&/uses-policies&
&/device-admin&
STEP2: "激活"按钮 执行代码:
* 激活设备管理权限
* 成功执行激活时,DeviceAdminReceiver中的 onEnabled 会响应
private void activeManage() {
// 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
//权限列表
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
//描述(additional explanation)
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "------ 其他描述 ------");
startActivityForResult(intent, 0);
这边就是用了一个隐式Intent ,通过这个Intent (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)跳转到 权限提醒页面。 同时传递了两个参数EXTRA_DEVICE_ADMIN 、&EXTRA_ADD_EXPLANATION。
EXTRA_DEVICE_ADMIN参数中说明了用到哪些权限,&EXTRA_ADD_EXPLANATION参数为附加的说明。
就这样,一个激活功能就完成了。 激活页面如下:
上图中" 设备管理软件说明: 我们不是黑客,请放心!" 对应的是&AndroidManifest.xml文件中 &android:description="@string/device_des"。
"------ 其他描述 ------" 就是之前传的&EXTRA_ADD_EXPLANATION 参数。
个人觉得两者要一个就可以了, 不知道为什么要提供两个。
STEP 3: 点击"激活"。&
此时该应用就拥有了设备管理权限。&激活时&AdminReceiver 类的 &onEnabled方法会被调用。
2. &禁用& 功能。
&& 如果在上面选择了"激活", 那么你这个应用就可以一直使用这些权限了,不需要再次激活。 但是如果想"禁用",该怎么做呢?
答案很简单,只要调用下面的方法即可.
* 禁用设备管理权限
* 成功执行禁用时,DeviceAdminReceiver中的 onDisabled 会响应
private void unActiveManage() {
Logger.d("------ unActiveManage ------");
boolean active = policyManager.isAdminActive(componentName);
if (active) {
policyManager.removeActiveAdmin(componentName);
禁用时&AdminReceiver 类的 &onDisabled方法会被调用。
3. &系统锁&
&& &其实到这已经非常简单了,所有的配置及初始化,都在激活时做了。
&& &下面直接上调用系统锁的代码:
boolean active = policyManager.isAdminActive(componentName);
if (active) {
policyManager.lockNow();
到此为止, 屏幕锁定结束了。
附上主要类的代码:
package com.
import com.yfz.broadcast.AdminR
import com.yfz.log.L
import android.app.A
import android.app.ActivityM
import android.app.AlertD
import android.app.admin.DevicePolicyM
import ponentN
import android.content.C
import android.content.I
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
public class Lesson13 extends Activity implements OnClickListener {
private DevicePolicyManager policyM
private ComponentName componentN
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lesson13);
//获取设备管理服务
policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
//AdminReceiver 继承自 DeviceAdminReceiver
componentName = new ComponentName(this, AdminReceiver.class);
private void init() {
Button active = (Button)findViewById(R.id.active);
Button unactive = (Button)findViewById(R.id.unactive);
Button syslock = (Button)findViewById(R.id.syslock);
active.setOnClickListener(this);
unactive.setOnClickListener(this);
syslock.setOnClickListener(this);
public void onClick(View v) {
switch(v.getId()) {
case R.id.active:
activeManage();
case R.id.unactive:
unActiveManage();
case R.id.syslock:
systemLock();
* 激活设备管理权限
* 成功执行激活时,DeviceAdminReceiver中的 onEnabled 会响应
private void activeManage() {
// 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
//权限列表
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
//描述(additional explanation)
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "------ 其他描述 ------");
startActivityForResult(intent, 0);
* 禁用设备管理权限
* 成功执行禁用时,DeviceAdminReceiver中的 onDisabled 会响应
private void unActiveManage() {
Logger.d("------ unActiveManage ------");
boolean active = policyManager.isAdminActive(componentName);
if (active) {
policyManager.removeActiveAdmin(componentName);
* 调出系统锁
private void
systemLock() {
Logger.d("------ Lock Screen ------");
boolean active = policyManager.isAdminActive(componentName);
if (active) {
policyManager.lockNow();
最后说一下,设备管理拥有的权限,一共就5个。
看配置文件中的说明吧。
&&?xml version="1.0" encoding="UTF-8"?&
&device-admin
xmlns:android="/apk/res/android"&
&uses-policies&
&!-- 强行锁定 --&
&force-lock /&
&!-- 清除所有数据(恢复出厂设置) --&
&wipe-data /&
&!-- 重置密码 --&
&reset-password /&
&!-- 限制密码选择 --&
&limit-password /&
&!-- 监控登录尝试 --&
&watch-login /&
&/uses-policies&
&/device-admin&
所有权限都申请时的效果图:
强制屏幕锁定功能, 可以应用于一些安全软件, 比如手机安全卫士, 当手机丢失后,用户发送指令短信、或者邮件到该手机上, 让手机强制锁屏。 这样的话,及时别人捡到了,也无法使用。&
不过一般手机用户可能不一定会设定手机锁,因此调用系统锁可能并没有多大作用,因此下一篇我们做一个自定义锁, 该锁只在需要时启用。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1636281次
积分:13355
积分:13355
排名:第402名
原创:123篇
转载:53篇
评论:741条}

我要回帖

更多关于 1password安卓版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信