码迷,mamicode.com
首页 > 移动开发 > 详细

Android : DevicePolicyManager

时间:2016-05-27 11:59:19      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:

介绍

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

Android : DevicePolicyManager

标签:

原文地址:http://blog.csdn.net/doris_d/article/details/51499836

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!