DevicePolicyManager使用

1.在清单文件注册receiver

       <receiver android:name=".MyAdmin"
            android:permission="android.permission.BIND_DEVICE_ADMIN">  //这个权限必须要申请
	    <meta-data android:name="android.app.device_admin"
		       android:resource="@xml/my_admin" />
            <intent-filter>
		      <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
       </receiver>


2.res/xml/my_admin.xml

//在MainActivity中通过startActivity启动DeviceAdminAdd界面,DeviceAdminAdd的oncreate方法中会解析此xml,然后加载将条目加载到device_admin_add.xml布局.
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-policies>
              <limit-password />  //设置密码的规则
        	<watch-login />     //监控屏幕解锁尝试次数
        	<reset-password />  //更改屏幕解锁密码
        	<force-lock />      //设备自动锁屏
        	<wipe-data />       //删除全部的数据
        	<expire-password />  //设置到期密码
        	<encrypted-storage />  //加密存储
        	<disable-camera />  //禁止使用摄像头
        	<disable-keyguard-features />  //禁止使用软键盘
        </uses-policies>
</device-admin>


3.MainActivity.java

       DevicePolicyManager manager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
			ComponentName mAdminName = new ComponentName(this, MyAdmin.class);
       if (!manager .isAdminActive(mAdminName)) {  //需要用户手动激活管理权限
	      Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
	      intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mAdminName);
	      startActivity(intent);
       //此Intent 会去调用Settings中的DeviceAdminAdd Activity界面,
       }

DevicePolicyData类的mAdminMap集合,ArrayMap<ComponentName, ActiveAdmin> mAdminMap = new ArrayMap<>(); 存放获得权限的ComponentName;



4.MyAdmin.java

此类是一个Receiver,需要继承DeviceAdminReceiver,当设备状态改变时会调用对应的方法.如果不需要,则可不必实现.onReceive
方法在DeviceAdminReceiver中也已经实现,所以在MyAdmin中可以不实现.

public class MyAdmin extends DeviceAdminReceiver {
	@Override
	public DevicePolicyManager getManager(Context context) {
		return super.getManager(context);
	}
	@Override
	public ComponentName getWho(Context context) {
		//谁申请管理权限
		return super.getWho(context);
	}
	@Override
	public void onEnabled(Context context, Intent intent) {
		//启用了策略
		super.onEnabled(context, intent);
	}
	@Override
	public CharSequence onDisableRequested(Context context, Intent intent) {
		//试图停用策略
		return super.onDisableRequested(context, intent);
	}
	@Override
	public void onDisabled(Context context, Intent intent) {
		//停用了策略
		super.onDisabled(context, intent);
	}
	@Override
	public void onPasswordChanged(Context context, Intent intent) {
		//改变了密码
		super.onPasswordChanged(context, intent);
	}
	@Override
	public void onPasswordFailed(Context context, Intent intent) {
		//密码尝试失败
		super.onPasswordFailed(context, intent);
	}
	@Override
	public void onPasswordSucceeded(Context context, Intent intent) {
		//密码尝试成功
		super.onPasswordSucceeded(context, intent);
	}
	@Override
	public void onPasswordExpiring(Context context, Intent intent) {
		//密码过期
		super.onPasswordExpiring(context, intent);
	}
	@Override
	public void onReceive(Context context, Intent intent) {
		//广播接收
		super.onReceive(context, intent);
	}
}

获取到管理权限后通过调用manager的set和get方法对设备状态进行设置和获取,如果只是要获取一些设备状态的话,则可不用去实现
DeviceAdminReceiver类,在获得管理权限后直接get相关属性方法即可,例如:boolean isCameraDisabled = manager.getCameraDisabled(null);







如果你想要在应用中调用 `devicePolicyManager.setProfileOwner()` 方法设置设备所有者,你需要满足以下条件: 1. 你的应用必须被系统签名。 2. 你的应用必须是设备上的第一个已安装的应用。也就是说,如果设备上已经有其他应用被设置为设备所有者,你的应用就无法再次设置设备所有者。 3. 你的应用必须在设备的出厂设置中被预装。如果你的应用是用户手动安装的,那么你就无法设置设备所有者。 如果你的应用满足以上条件,但是仍然无法调用 `devicePolicyManager.setProfileOwner()` 方法,可能是因为你的应用没有获得正确的权限。你需要在你的应用的 `AndroidManifest.xml` 文件中添加以下权限声明: ```xml <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> ``` 如果你的应用已经声明了这些权限,但是仍然无法调用 `devicePolicyManager.setProfileOwner()` 方法,可能是因为你的应用没有获得正确的签名认证。你需要确保你的应用已经被正确地签名,并且签名的证书和系统签名的证书是相同的。 如果你的应用仍然无法调用 `devicePolicyManager.setProfileOwner()` 方法,你可以尝试使用 `adb shell dpm set-device-owner` 命令来设置设备所有者。这个命令需要在设备的终端中执行,需要使用 root 权限。如果你需要在应用中执行这个命令,可以使用 `Runtime.getRuntime().exec()` 方法来执行命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值