(7).android.app.admin(控制设备管理器的一些类)

该包主要是控制一些系统的设置:

在res文件建立xml/my_admin.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 
    limit-password  设置密码的规则
    watch-login 监控屏幕解锁尝试次数
    reset-password 更改屏幕解锁密码
    force-lock 设备自动锁屏
    wipe-data 删除全部的数据
    
     -->
    <uses-policies>
        <limit-password/>
        <watch-login />
        <reset-password />
        <force-lock />
        <wipe-data />
    </uses-policies>
</device-admin>
设置的以上这些属性是会在系统设备管理器界面出现的一些权限设置。


然后是需要自己继承DeviceAdminReceiver来实现自己的广播接接受者:

package com.yfz.broadcast;
import com.yfz.log.Logger;
import android.app.admin.DeviceAdminInfo;
import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.IBinder;
import android.widget.Toast;
public class AdminReceiver extends DeviceAdminReceiver {
	@Override
	public DevicePolicyManager getManager(Context context) {
		Logger.d("------" + "getManager" + "------");
		return super.getManager(context);
	}
	@Override
	public ComponentName getWho(Context context) {
		Logger.d("------" + "getWho" + "------");
		return super.getWho(context);
	}
	
	/**
	 * 禁用
	 */
	@Override
	public void onDisabled(Context context, Intent intent) {
		Logger.d("------" + "onDisabled" + "------");
		
		Toast.makeText(context, "禁用设备管理", Toast.LENGTH_SHORT).show();
		
		super.onDisabled(context, intent);
	}
	@Override
	public CharSequence onDisableRequested(Context context, Intent intent) {
		Logger.d("------" + "onDisableRequested" + "------");
		return super.onDisableRequested(context, intent);
	}
	
	/**
	 * 激活
	 */
	@Override
	public void onEnabled(Context context, Intent intent) {
		Logger.d("------" + "onEnabled" + "------");
		
		Toast.makeText(context, "启动设备管理", Toast.LENGTH_SHORT).show();
		
		super.onEnabled(context, intent);
	}
	@Override
	public void onPasswordChanged(Context context, Intent intent) {
		Logger.d("------" + "onPasswordChanged" + "------");
		super.onPasswordChanged(context, intent);
	}
	@Override
	public void onPasswordFailed(Context context, Intent intent) {
		Logger.d("------" + "onPasswordFailed" + "------");
		super.onPasswordFailed(context, intent);
	}
	@Override
	public void onPasswordSucceeded(Context context, Intent intent) {
		Logger.d("------" + "onPasswordSucceeded" + "------");
		super.onPasswordSucceeded(context, intent);
	}
	@Override
	public void onReceive(Context context, Intent intent) {
		Logger.d("------" + "onReceive" + "------");
		
		super.onReceive(context, intent);
	}
	@Override
	public IBinder peekService(Context myContext, Intent service) {
		Logger.d("------" + "peekService" + "------");
		return super.peekService(myContext, service);
	}
	
}
在父类的DeviceAdminReceiver中已经实现了onReceive:

 @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_PASSWORD_CHANGED.equals(action)) {
            onPasswordChanged(context, intent);
        } else if (ACTION_PASSWORD_FAILED.equals(action)) {
            onPasswordFailed(context, intent);
        } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) {
            onPasswordSucceeded(context, intent);
        } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) {
            onEnabled(context, intent);
        } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
            CharSequence res = onDisableRequested(context, intent);
            if (res != null) {
                Bundle extras = getResultExtras(true);
                extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
            }
        } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
            onDisabled(context, intent);
        } else if (ACTION_PASSWORD_EXPIRING.equals(action)) {
            onPasswordExpiring(context, intent);
        }
    }
在不同条件触发的时候会调用不同的方法,所以子类如果需要做一些响应的操作,可以重写方法来实现

这个写好之后还需要在AndroidManifest.xml 文件中注册:

		<!-- 设备管理 -->
		<receiver android:name=".broadcast.AdminReceiver"
			android:label="@string/device"
			android:description="@string/device_des"
			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>

其中 

android:permission="android.permission.BIND_DEVICE_ADMIN" 和

 

<intent-filter>

<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />

</intent-filter>

 

是必须的。

 

android:resource="@xml/my_admin" 对应的就是权限说明文件。

这些做好准备之后,就需要在代码里激活设备管理器了:

//获取设备管理服务  
        policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);  
          
        //AdminReceiver 继承自 DeviceAdminReceiver  
        componentName = new ComponentName(this, AdminReceiver.class); 
/** 
     * 激活设备管理权限 
     * 成功执行激活时,DeviceAdminReceiver中的 onEnabled 会响应 
     */  
    private void activeManage() {  
        // 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器  
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
          
        //权限列表  
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);  
          
        //描述(additional explanation)  
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "------ 其他描述 ------");  
          
        startActivityForResult(intent, 0);  
    }  
AndroidManifest.xml文件中  android:description="@string/device_des"是做一些说明的

EXTRA_ADD_EXPLANATION参数也是传一些说明文件的

package com.yfz;
import com.yfz.broadcast.AdminReceiver;
import com.yfz.log.Logger;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Lesson13 extends Activity implements OnClickListener {
	
	private DevicePolicyManager policyManager;
	private ComponentName componentName;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lesson13);
		
		//获取设备管理服务
		policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
		
		//AdminReceiver 继承自 DeviceAdminReceiver
		componentName = new ComponentName(this, AdminReceiver.class);
		
		init();
	}
	private void init() {
		Button active = (Button)findViewById(R.id.active);
		Button unactive = (Button)findViewById(R.id.unactive);
		Button syslock = (Button)findViewById(R.id.syslock);
		
		active.setOnClickListener(this);
		unactive.setOnClickListener(this);
		syslock.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		switch(v.getId()) {
			case R.id.active:
				activeManage();
				break;
			case R.id.unactive:
				unActiveManage();
				break;
			case R.id.syslock:
				systemLock();
				break;
			default:
				break;
		}
	}
	
	/**
	 * 激活设备管理权限
	 * 成功执行激活时,DeviceAdminReceiver中的 onEnabled 会响应
	 */
	private void activeManage() {
		// 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器
		Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
		
		//权限列表
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
        
        //描述(additional explanation)
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "------ 其他描述 ------");
        
        startActivityForResult(intent, 0);
	}
	
	/**
	 * 禁用设备管理权限
	 * 成功执行禁用时,DeviceAdminReceiver中的 onDisabled 会响应
	 */
	private void unActiveManage() {
		Logger.d("------ unActiveManage ------");
		boolean active = policyManager.isAdminActive(componentName);
        if (active) {
        	policyManager.removeActiveAdmin(componentName);
        }
	}
	
	/**
	 * 调出系统锁
	 */
	private void  systemLock() {
    	Logger.d("------ Lock Screen ------");
        boolean active = policyManager.isAdminActive(componentName);
        if (active) {
        	policyManager.lockNow();
        }
	}
}

总体来说:在使用这些设置的时候需要先激活它的权限。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中动态添加 Device Admin 权限,需要使用 DevicePolicyManager 。下面是一个简单的示例代码: 1. 首先,在 AndroidManifest.xml 文件中声明需要使用 Device Admin 权限: ``` <receiver android:name=".MyDeviceAdminReceiver" android:description="@string/device_admin_description" android:label="@string/device_admin_label" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_receiver" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> ``` 2. 创建一个 DeviceAdminReceiver 子 MyDeviceAdminReceiver,用于接收设备管理器事件的回调,并在 onEnabled() 方法中处理设备管理器启用事件: ``` public class MyDeviceAdminReceiver extends DeviceAdminReceiver { @Override public void onEnabled(Context context, Intent intent) { super.onEnabled(context, intent); // 在此处添加设备管理器所需的权限 DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName componentName = new ComponentName(context, MyDeviceAdminReceiver.class); if (dpm.isAdminActive(componentName)) { dpm.setCameraDisabled(componentName, true); } } } ``` 3. 在应用程序中动态请求设备管理器权限,并在用户授权后激活设备管理器: ``` private static final int REQUEST_CODE_ENABLE_ADMIN = 1; private void requestAdminPermissions() { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); ComponentName componentName = new ComponentName(this, MyDeviceAdminReceiver.class); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "需要设备管理器权限以禁用摄像头"); startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_ENABLE_ADMIN) { if (resultCode == RESULT_OK) { // 设备管理器已激活,可以使用相关权限了 } else { // 用户拒绝了设备管理器权限 } } } ``` 以上就是在 Android 中动态添加 Device Admin 权限的简单示例代码。需要注意的是,设备管理器权限是非常敏感的权限,需要经过用户授权才能使用。在使用时,应提供必要的解释说明以获得用户的信任,并且在用户拒绝授权时,应优雅地处理相关逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值