Android : DevicePolicyManager

介绍

Android 2.2(API 8)开始提供了一个可管理和操作设备的类DevicePolicyManager,通过这个类可以进行锁屏、设置密码、清除密码、恢复出厂设置等操作。具体功能有:

  • 恢复出厂设置
  • 更改屏幕解锁密码
  • 设置密码规则
  • 监视屏幕解锁尝试次数
  • 锁定屏幕
  • 设置设备全局代理
  • 设置锁定屏幕密码的有效期
  • 设置存储设备加密
  • 停用相机
  • 锁屏时禁用某些功能

使用方法

  • 定义Receiver,继承DeviceAdminReceiver
  • 添加xml,定义需要的管理权限清单
  • 在AndroidManifest.xml中注册receiver
  • 使用DeviceAdminReceiver操作设备

代码详解

  • MyDeviceAdminReceiver.java

    import android.app.admin.DeviceAdminReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
    
        @Override
        public void onEnabled(Context context, Intent intent) {
            super.onEnabled(context, intent);
            Toast.makeText(context, "设备管理器:已激活", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onDisabled(Context context, Intent intent) {
            super.onDisabled(context, intent);
            Toast.makeText(context, "设备管理器:未激活", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public CharSequence onDisableRequested(Context context, Intent intent) {
            return "这是一个可选的消息,警告有关禁止用户的请求";
        }
    
        @Override
        public void onPasswordChanged(Context context, Intent intent) {
            super.onPasswordChanged(context, intent);
            Toast.makeText(context, "设备管理;密码已经改变", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onPasswordFailed(Context context, Intent intent) {
            super.onPasswordFailed(context, intent);
            Toast.makeText(context, "设备管理;改变密码失败", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onPasswordSucceeded(Context context, Intent intent) {
            super.onPasswordSucceeded(context, intent);
            Toast.makeText(context, "设备管理;改变密码成功", Toast.LENGTH_SHORT).show();
        }
    }
    
  • my_device_admin.xml
    <?xml version="1.0" encoding="utf-8"?>
    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    
        <uses-policies>
            <disable-camera />  <!-- 停用相机 -->
            <disable-keyguard-features />  <!-- 锁屏时禁用某些功能 -->
            <encrypted-storage />  <!-- 设置存储设备加密 -->
            <expire-password />  <!-- 设置锁定屏幕密码的有效期 -->
            <force-lock />  <!-- 锁定屏幕 -->
            <limit-password /> <!-- 设置密码规则 -->
            <reset-password /> <!-- 更改屏幕解锁密码 -->
            <set-global-proxy />  <!-- 设置设备全局代理 -->
            <watch-login /> <!-- 监控屏幕解锁尝试次数 -->
            <wipe-data /> <!-- 恢复出厂设置 -->
        </uses-policies>
    </device-admin>
  • AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xd.devicepolicymanager" >
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme" >
            <activity android:name=".MainActivity" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <receiver android:name=".MyDeviceAdminReceiver"
                android:label="@string/app_lable"
                android:description="@string/app_description"
                android:permission="android.permission.BIND_DEVICE_ADMIN">
                <meta-data
                    android:name="android.app.device_admin"
                    android:resource="@xml/my_device_admin"/>
                <intent-filter>
                    <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
                </intent-filter>
            </receiver>
        </application>
    
    </manifest>
    
    • android:name=”.MyDeviceAdminReceiver” 自定义Receiver
    • android:label=”@string/app_lable” 对应设备管理器中的名称
    • android:description=”@string/app_description” 对应设备管理器中的描述
    • android:resource=”@xml/my_device_admin” 自定义权限清单

  • activity_main.xml
    <?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:orientation="vertical"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin">
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="激活设备管理器"
            android:id="@+id/btn_active"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="取消激活设备管理器"
            android:id="@+id/btn_cancel_active"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="修改密码为1234"
            android:id="@+id/btn_change_password"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="取消密码"
            android:id="@+id/btn_cancel_password"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="锁屏"
            android:id="@+id/btn_lock"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="设置锁屏时间(5s)"
            android:id="@+id/btn_lock_time"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="取消设置锁屏时间"
            android:id="@+id/btn_cancel_lock_time"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="恢复出厂设置"
            android:id="@+id/btn_wipe_data"/>
    </LinearLayout>
    
  • MainActivity.java
    import android.app.Activity;
    import android.app.admin.DevicePolicyManager;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Build;
    import android.os.IBinder;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class MainActivity extends AppCompatActivity {
    
        /**
         * 激活组件的请求码
         */
        private static final int REQUEST_CODE_ACTIVE_COMPONENT = 1;
    
        /**
         * 设备安全管理服务,2.2之前需要通过反射技术获取
         */
        private DevicePolicyManager devicePolicyManager = null;
        /**
         * 对应自定义DeviceAdminReceiver的组件
         */
        private ComponentName componentName = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
            componentName = new ComponentName(this, MyDeviceAdminReceiver.class);
    
            /**
             * 激活设备管理器
             */
            findViewById(R.id.btn_active).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        Toast.makeText(MainActivity.this, "设备管理器已激活", Toast.LENGTH_SHORT).show();
                    } else {
                        // 打备管理器的激活窗口
                        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                        // 指定需要激活的组件
                        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
                        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "(激活窗口中的描述信息)");
                        startActivityForResult(intent, REQUEST_CODE_ACTIVE_COMPONENT);
                    }
                }
            });
    
            /**
             * 取消激活设备管理器
             */
            findViewById(R.id.btn_cancel_active).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        devicePolicyManager.removeActiveAdmin(componentName);
                        Toast.makeText(MainActivity.this, "将触发DeviceAdminReceiver.onDisabled", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            /**
             * 修改锁屏密码
             */
            findViewById(R.id.btn_change_password).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        devicePolicyManager.resetPassword("1234", 0);
                        Toast.makeText(MainActivity.this, "若发生改变,则将触发DeviceAdminReceiver.onPasswordChanged", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            /**
             * 取消锁屏密码
             */
            findViewById(R.id.btn_cancel_password).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        devicePolicyManager.resetPassword("", 0);
                        Toast.makeText(MainActivity.this, "若发生改变,则将触发DeviceAdminReceiver.onPasswordChanged", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            /**
             * 锁屏
             */
            findViewById(R.id.btn_lock).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        devicePolicyManager.lockNow();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            /**
             * 设置锁屏时间
             */
            findViewById(R.id.btn_lock_time).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        devicePolicyManager.setMaximumTimeToLock(componentName, 5000);
                        Toast.makeText(MainActivity.this, "锁屏设置将不可用", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            /**
             * 取消锁屏时间
             */
            findViewById(R.id.btn_cancel_lock_time).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        devicePolicyManager.setMaximumTimeToLock(componentName, Long.MAX_VALUE);
                        Toast.makeText(MainActivity.this, "锁屏设置恢复可用", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
            /**
             * 恢复出厂设置
             */
            findViewById(R.id.btn_wipe_data).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isAdminActive()) {
                        // 模拟器上无效,真机上慎用
    //            devicePolicyManager.wipeData(0);
                        Toast.makeText(MainActivity.this, "源码已屏蔽,慎用", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "设备管理器未激活", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    
        /**
         * 判断该组件是否有系统管理员的权限(【系统设置-安全-设备管理器】中是否激活)
         * @return
         */
        private boolean isAdminActive() {
            return devicePolicyManager.isAdminActive(componentName);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == REQUEST_CODE_ACTIVE_COMPONENT) {
                // 激活组件的响应
                if (resultCode == Activity.RESULT_CANCELED) {
                    Toast.makeText(this, "用户手动取消激活", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "已触发DeviceAdminReceiver.onEnabled", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    


Android Studio 项目下载:android_devicepolicymanager

时间: 2024-09-07 06:07:00

Android : DevicePolicyManager的相关文章

Android设备管理器&mdash;&mdash;DevicePolicyManager

自从安卓2.2(API=8)以后,安卓手机是通过设备管理API对手机进行系统级的设备管理. 本篇通过大家熟悉的"一键锁屏"的小项目实现来介绍设备管理API如何通过强制设备管理策略创建一个安全敏感的应用程序. 一键锁屏的实现原理:当按锁屏键的时候,会发出一个广播,当用户界面接收到一个广播的时候就可以实现锁屏.而广播的发送是我们调用DevicePolicyManager(设备管理接收者)中的lockNow()方法来实现. 锁屏需要将应用程序提升为系统管理员的权限,如果当前的应用具备系统管理

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

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

【起航计划 019】2015 起航计划 Android APIDemo的魔鬼步伐 18 App-&gt;Device Admin 设备管理器 DeviceAdminReceiver DevicePolicyManager PreferenceActivity的使用

Device Admin示例介绍了类DeviceAdminReceiver,DevicePolicyManager和ActivityManager. 使用DevicePolicyManager这个类,这个类可以接管手机的应用权限,对手机做出很多大胆的操作,比如锁屏.恢复出厂设置.设置密码.强制清除密码,修改密码.设置屏幕灯光渐暗时间间隔等操作. 当它Publish在AndroidManifest.xml作为BroadcastReceiver定义时,必须处理 android.app.action.

Android wiki : 18.DevicePolicyManager锁屏和清除数据

DevicePolicyManager 类:设备策略管理器   安全设备 Android 2.2 SDK提供了一个可管理和操作设备的API叫DevicePolicyManager, 使用这个API你可以接管手机的应用权限,对手机做出很多大胆的操 作, 比如锁屏.恢复出厂设置.设置密码.强制清除密码,修改密码.设置屏幕灯光渐暗时间间隔等操作. 这个API让你的程序直接掌握了系统的命脉. 但是,同样的道理,别人也可以做类似的程序,各程序之间的权限是不起冲突的~ 首先,要想调用DevicePolicy

关于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 7.0 Nougat(牛轧糖)---对开发者来说

android 7.0出来了.让你的app准备迎接最新的android版本吧,支持节省电量和内存,这样新的系统行为.使用多窗口UI.直接恢复通知以及其他操作来扩展你的app. android 7.0介绍了各种各样的新功能给用户和开发者, 本文重点介绍面向开发者的一些新功能. 确保检查android 7.0的行为变化,了解有关平台的变化可能会影响你的app. 如果要了解更多的关于用户的新功能,请查看www.android.com. 1.支持多窗口 在android 7.0中,我们介绍了在支持多窗口

android从应用到驱动之—camera(2)---cameraHAL的实现

本来想用这一篇博客把cameraHAL的实现和流程都给写完的.搞了半天,东西实在是太多了.这篇先写cameraHAL的基本实现框架,下一篇在具体写camerahal的流程吧. cameraHAL的实现: 对于初学者来说,最大的疑问是系统是如何调用hardware的.这里就以camera来举例说明.调用hardware的程序是cameraservice,我们就去它里面看看它是如何找到hardware的 先把源码贴上来: /* ** ** Copyright (C) 2008, The Androi

Android之——申请应用系统管理员权限

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47010177  把应用程序升级为拥有系统管理员权限.写一个广播接收者,给该广播接收者去申请系统管理员的权限,让操作系统给广播接收者授权.(激活系统的授权组件).在此,本人主要通过申请应用系统管理员权限,锁屏,设置密码,恢复出厂设置几个方面来简单介绍Android中如何给一个应用申请系统管理员的权限操作.其中,这些主要的功能都是通过Android提供的一个类来完成的,这个类就是De

[android] 手机卫士设备管理权限锁屏

设备管理员 Device Admin 获取DevicePolicyManager对象,通过getSystemService(DEVICE_POLICY_MANAGER),设备策略管理器 调用DevicePolicyManager对象的lockNow()方法,锁定,此时会报 安全异常 新建一个类MyAdmin继承系统的DeviceAdminReceiver,这个是广播接收者 清单文件进行注册 添加<receiver>节点,设置名称 设置权限 android:permission=”android