Android设备管理器——DevicePolicyManager

自从安卓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,布布扣,bubuko.com

时间: 2024-08-26 06:47:22

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

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

2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A.该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏洞,能够在设置程序的设备管理器列表中隐藏,这样用户就无法通过正常途径取消该手机木马的设备管理器权限.从而达到无法卸载的目的.Android4.2版本号以上系统已经修复该漏洞.(漏洞详情:http://blog.csdn.net/androidsecurity/article/details/9124

Android设备管理器漏洞分析!

一.漏洞描述 目前被称为“史上最强Android木马”的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载.其实该漏洞早在去年底已被发现. 注册为“设备管理器”的应用是无法被直接卸载的.只有取消激活“设备管理器”后才可以直接卸载.  木马可以利用Android设备管理器漏洞达到在设备管理器列表“隐身”的效果.这样用户就无法进去“取消激活”页面,从而达到无法卸载的目的. 二.影响版本 Android2.2以上(4.0,4.1,4.2)

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

2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A,该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏洞,可以在设置程序的设备管理器列表中隐藏,这样用户就无法通过正常途径取消该手机木马的设备管理器权限,从而达到无法卸载的目的.Android4.2版本以上系统已经修复该漏洞.(漏洞详情:http://blog.csdn.net/androidsecurity/article/details/91247

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

转自http://bbs.pediy.com/showthread.php?t=183692 想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设备管理器后,该程序会在setting设备管理器列表隐藏,应用程序激活成设备管理器后,可以实现锁屏.擦除用户数据等功能,并且无法使用常规的卸载方式对其卸载,本文主要和介绍漏洞原理和漏洞补丁分享个人在分析过程中遇到的一些事情. Android 在实现设备管理器时,需要再manifest.xml中注册一个

关于android设备管理器的一些分析

作 者: limitemp 时 间: 2014-01-12,20:43:04 链 接: http://bbs.pediy.com/showthread.php?t=183692 想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设备管理器后,该程序会在setting设备管理器列表隐藏,应用程序激活成设备管理器后,可以实现锁屏.擦除用户数据等功能,并且无法使用常规的卸载方式对其卸载,本文主要和介绍漏洞原理和漏洞补丁分享个人在分析过程中遇到的一些

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

在Andorid的设置->安全里面有个设备管理器的选项,相信大部分android用户都不太会去注意这个东西.近期在安装了一个应用之后发现这个里面的东西变了.怎么回事呢,研究研究看看.</span> 老思路,从已有的最明显的线索開始分析."设备管理器"这几个字就是最好的线索,在Setting的package里面搜搜,一大堆多语言话的字符串,这个不是我要找的,我要找的是谁在用这个字符串.在一个布局文件中找到了: res/xml/security_settings.xml

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

上回分析到了/data/system/device_policies.xml这个文件是在package change事件发生的时候变化的,那么来看看它的内容.根据以往的经验,在/data/system下面的几个文件(packages.xml  packages.list)都是PackageManager扫面各个package的Manifest文件生成的,估计这文件也差不多吧. <?xml version='1.0' encoding='utf-8' standalone='yes' ?> &l

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

该方案测试可行,系统版本4.4.2.它算是借助android系统的一个bug,不确定在后续更高的版本中是否修复. 该功能和360防卸载功能一样的实现原理. 主要的参考资料是:http://bbs.pediy.com/showthread.php?t=193123 public class MantaAdminReceiver extends DeviceAdminReceiver { @Override public void onReceive(Context context, Intent

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

Android Device Administration 设备管理器--锁屏的实现 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊的,就拿这个锁屏来说吧,我们现在市面上有一些一键锁屏的软件 我们可以看到,是数不胜数的,所以,其实他一开始使用的时候,都需要请求设备管理器 我们可以看到,只有当我们激活的时候,我们才可以使用它,那么,他到底是什么东西呢?其实,当我们激活之后,我们可以在我们手机的设置--安全--设备管理器里面看到他的所