Android : DevicePolicyManager
Posted doris_d
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Android : DevicePolicyManager的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )