自从安卓2.2(API=8)以后,安卓手机是通过设备管理API对手机进行系统级的设备管理。

本篇通过大家熟悉的“一键锁屏”的小项目实现来介绍设备管理API如何通过强制设备管理策略创建一个安全敏感的应用程序。

一键锁屏的实现原理:当按锁屏键的时候,会发出一个广播,当用户界面接收到一个广播的时候就可以实现锁屏。而广播的发送是我们调用DevicePolicyManager(设备管理接收者)中的lockNow()方法来实现。

锁屏需要将应用程序提升为系统管理员的权限,如果当前的应用具备系统管理员的权限,则直接调用lockNow()进行锁屏;如果应用是首次运行不具备系统管理员权限,则需要激活一个用户授权界面来让用户进行手动授权(重点)。

所以,一键锁屏的关键点就在于如何授权。

将应用程序具备系统管理员权限的做法:写一个广播的接收者,让该广播接受者去申请系统管理员的权限,让操作系统给广播接收者授权(其实就是去激活系统的授权组件),给用户自己激活。

实现流程:

关键的类:

1.DeviceAdminReceiver:设备管理接收者,该类提供了系统发出的意图动作。你的设备管理应用程序必须包含一个DeviceAdminReceiver 的子类。代表着手机上的设备管理器。

2.DevicePolicyManager  设备管理员

以下是根据流程写出的代码:

在MainActivity 主类中:

public class MainActivity extends Activity {

	private DevicePolicyManager policyManager;
private ComponentName componentName; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
componentName = new ComponentName(this, LockReceiver.class); if (policyManager.isAdminActive(componentName)) { //判断是否有权限(激活了设备管理器)
policyManager.lockNow();// 直接锁屏
finish();
}else{
activeManager();//激活设备管理器获取权限
finish();
}
} private void activeManager() {
//使用隐式意图调用系统方法来激活指定的设备管理器
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "一键锁屏");
startActivity(intent);
}
}
在LockReceiver 类中:
public class LockReceiver extends DeviceAdminReceiver {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
System.out.println("onreceiver");
} @Override
public void onEnabled(Context context, Intent intent) {
System.out.println("激活使用");
super.onEnabled(context, intent);
} @Override
public void onDisabled(Context context, Intent intent) {
System.out.println("取消激活");
super.onDisabled(context, intent);
}
}

定义并声明你的策略:在res/xml/lock.xml中声明所选择的策略集,它将会被程序强行实行。如果一个程序尝试调用在XML中没有对应策略的方法,

这将会在运行时导致一个*SecurityException*异常。如果程序打算管理其他策略,那么其他权限,例如'_强制锁(force-lock)。

如下代码片段在res/xml/lock.xml中声明了密码限制策略:

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
<uses-policies>
<!-- 锁定屏幕 -->
<force-lock />
</uses-policies>
</device-admin>

在 Android manifest(清单文件) 中引用XML策略声明:

    <!-- 引用xml策略声明 -->
<receiver
android:name="com.test.lockscreen.LockReceiver"
android:description="@string/app_name"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/lock_screen" /> <intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>

整个Android manifest(清单文件) :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.lockscreen"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.test.lockscreen.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar">>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver
android:name="com.test.lockscreen.LockReceiver"
android:description="@string/app_name"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/lock_screen" /> <intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver> </application> </manifest>

激活设备管理员 

好了。以上代码部署在模拟器中运行后,点击程序图标,将来到用户激活视图

如果用户选择"Activate",程序就会成为设备管理员并且可以开始配置及强制执行策略。再次运行程序将会实现一键锁屏。

如果用户选择"Cancle" 将会取消。

参考谷歌的API:http://developer.android.com/guide/topics/admin/device-admin.html#lock

代码下载链接:http://www.apkbus.com/android-177112-1-1.html

Android设备管理器——DevicePolicyManager的更多相关文章

  1. Android设备管理器 DevicePolicyManager

    设备管理器有个特点,你注册了之后如果不解除注册就会难以卸载带有设备管理器的应用,目前4.3版本仍未提示用户如何卸载,maybe later. 在「设定-安全」你可以看见「设备管理器」,它提供一些高级功 ...

  2. Android设备管理器漏洞2--禁止用户取消激活设备管理器

    2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A.该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏 ...

  3. Android设备管理器漏洞(转)

    一.漏洞描述 目前被称为“史上最强Android木马”的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载.其实该漏洞早在去年底已被发现. ...

  4. (转)关于android设备管理器的一些分析

    转自http://bbs.pediy.com/showthread.php?t=183692 想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设 ...

  5. 关于android的设备管理器-DevicePolicyManager(一)

    在Andorid的设置->安全里面有个设备管理器的选项,相信大部分android用户都不太会去注意这个东西.近期在安装了一个应用之后发现这个里面的东西变了.怎么回事呢,研究研究看看.</s ...

  6. 关于android的设备管理器-DevicePolicyManager(二)

    上回分析到了/data/system/device_policies.xml这个文件是在package change事件发生的时候变化的.那么来看看它的内容. 依据以往的经验.在/data/syste ...

  7. Android 设备管理器 阻止用户取消激活

    该方案测试可行,系统版本4.4.2.它算是借助android系统的一个bug,不确定在后续更高的版本中是否修复. 该功能和360防卸载功能一样的实现原理. 主要的参考资料是:http://bbs.pe ...

  8. Android Device Administration 设备管理器——实现一键锁屏

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

  9. Android学习笔记_61_手机安全卫士知识点归纳(1)状态/形状图形 GPS 设备管理器DeviceAdminReceiver ImageView属性

    1.在做程序自动安装更新的时候 ,必须保证程序的签名和包名是相同.  C:\Documents and Settings\zehua\.android  \ debug.keystore  debug ...

随机推荐

  1. 019、使用公共Registry (2019-01-10 周四)

    参考https://www.cnblogs.com/CloudMan6/p/6896488.html   在DockerHub上注册一个账号,这样就可以将自己构建的镜像上传到DockerHub上供别人 ...

  2. Android SVN上传项目

    方式一: 1 工具栏 VCS ——import into Version Control - Share Project (SubVersion)(注意不要用import into SubVersio ...

  3. 子线程导致 Windows 服务停止的情况(Topshelf 结合 Quartz.NET)

    Ø  前言 本文主要记录子线程导致 Topshelf 和 Quartz.NET 的 Windows 服务停止的现象,以及使用几种常用子线程的注意事项.因为我们有时可能需要开启多个线程执行复杂的逻辑,如 ...

  4. 十九、Linux 进程与信号---环境表

    19.1 环境表 19.1.1 介绍 这是启动例程的第二各作用,搜集环境表,然后传递给主函数. 环境表就是一个指针数组.      环境表 每个进程都有一个独立的环境表 初始的环境表继承自父进程 主函 ...

  5. mysql 5.7 ERROR 1054(42S22) Unknown column 'password' in ‘field list’ 报错

    mysql 忘记密码 报错?ERROR 1054(42S22) Unknown column 'password' in ‘field list’原因:5.7版本下的mysql数据库下已经没有pass ...

  6. git 配置ssh key

    第一次生成 ssh key 进入ssh目录  cd ~/.ssh,再输入:ls ,查看文件,如果有.pub的文件,说明已有ssh key 如果没有, 则生成秘钥:ssh-keygen -t rsa - ...

  7. Coursera, Deep Learning 1, Neural Networks and Deep Learning - week2, Neural Networks Basics

    Logistic regression Cost function for logistic regression Gradient Descent 接下来主要讲 Vectorization Logi ...

  8. 使用Python的turtle库画圣诞树

    代码如下: from turtle import * import random import time n = 80.0 speed("fastest") screensize( ...

  9. 向dnsrecord.txt 中添加 配置

    #!/bin/bash Ip_addr=`cat /etc/dnsrecord.txt |awk '{print $1}' |head -1` Check_dns_url(){ grep $1 /et ...

  10. Codeforces Round #494 (Div. 3) D. Coins and Queries(贪心

    题目链接 题目大意:给你n个物品,第iii个物品价值aia_iai​,询问q次,问你能不能凑出价值为qiq_iqi​的物品. 小贪心吧.从大到小找,能拿就拿就行了. #include<bits/ ...