激活设备管理器就是把系统的某些权力例如锁屏,链接蓝牙等功能交给某个应用来执行。也就是说,如果想要某个应用执行某些系统超级管理员才能执行的功能时,就需要让这个应用激活设备管理器。此时该应用就拿到了系统管理员的权限。
这件事要怎么做呢?
写一个广播接收者,给这个BroadcastReceiver申请系统管理员的权限,让操作系统给广播接收者授权。这样就激活了系统的授权组件。这些功能都是由android提供的DevicePolicyManager类来完成的。
下面用申请应用系统管理员以及一键锁屏来介绍这个权限操作。
1.首先创建自定义的权限xml文件– device_admin.xml
在Android工程的res目录下新建xml目录,在xml目录下新建device_admin.xml文件
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<force-lock/> //一键锁屏
<disable-camera/> //停用相机,禁止使用所有设备摄像头
<limit-password/>//设置密码规则
<watch-login/>//监视屏幕解锁尝试次数,如果输错次数过多则锁定手机或者清除所有数据
<reset-password/>//重置密码
<wipe-data/>//恢复出厂设置
</uses-policies>
</device-admin>
可以看到后四个的权限很大,最好不要在真机上测试。本例只用
2.创建布局文件,主要是定义三个按钮:注册组件,注销组件和锁屏。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.cindy.onekeylock.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_regDivice"
android:text="注册成为系统组件"
android:textSize="@dimen/activity_horizontal_margin"
android:gravity="center"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_unRegDivice"
android:text="注销系统组件"
android:textSize="@dimen/activity_horizontal_margin"
android:gravity="center"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_lockScreen"
android:text="锁屏"
android:textSize="@dimen/activity_horizontal_margin"
android:gravity="center"/>
</LinearLayout>
3.定义BroadcastReceiver–DeviceManagerBC,使之继承DeviceAdminReceiver。
package com.cindy.onekeylock;
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
/**
* Created by Cindy on 2016/10/23.
*/
public class DeviceManagerBC extends DeviceAdminReceiver{
@Override
public void onEnabled(Context context, Intent intent) {
super.onEnabled(context, intent);
System.out.println("已经注册成为系统组件");
}
@Override
public void onDisabled(Context context, Intent intent) {
super.onDisabled(context, intent);
System.out.println("已经注销了系统组件");
}
}
4.在AndroidManifest.xml文件中注册BroadcastReceiver。
<receiver android:name=".DeviceManagerBC">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/device_admin"/>
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
<action android:name="android.app.action.DEVICE_ADMIN_DISABLED"/>
</intent-filter>
</receiver>
5.在MainActivity中完善各个按钮的功能。
package com.cindy.onekeylock;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_regDivice,btn_unRegDivice,btn_lockScreen;
private DevicePolicyManager devicePolicyManager;
public ComponentName componentName;//权限监听器
private boolean flag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_regDivice = (Button)findViewById(R.id.btn_regDivice);
btn_regDivice.setOnClickListener(this);
btn_unRegDivice = (Button)findViewById(R.id.btn_unRegDivice);
btn_unRegDivice.setOnClickListener(this);
btn_lockScreen = (Button)findViewById(R.id.btn_lockScreen);
btn_lockScreen.setOnClickListener(this);
devicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
componentName = new ComponentName(this,DeviceManagerBC.class);//用广播接收器实例化一个系统组件
flag = devicePolicyManager.isAdminActive(componentName);//判断这个应用是否激活了设备管理器
if(flag){
btn_regDivice.setVisibility(View.GONE);
btn_lockScreen.setVisibility(View.VISIBLE);
btn_unRegDivice.setVisibility(View.VISIBLE);
}else{
btn_regDivice.setVisibility(View.VISIBLE);
btn_lockScreen.setVisibility(View.GONE);
btn_unRegDivice.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_regDivice:
Intent i = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);//激活系统设备管理器
i.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);//注册系统组件
startActivity(i);
break;
case R.id.btn_unRegDivice:
devicePolicyManager.removeActiveAdmin(componentName);//注销系统组件
this.finish();
break;
case R.id.btn_lockScreen:
devicePolicyManager.lockNow();
this.finish();
break;
}
}
@Override
protected void onResume(){
super.onResume();
boolean flagChanged = devicePolicyManager.isAdminActive(componentName);//判断这个应用是否激活了设备管理器
if(flagChanged){
btn_regDivice.setVisibility(View.GONE);
btn_lockScreen.setVisibility(View.VISIBLE);
btn_unRegDivice.setVisibility(View.VISIBLE);
}else{
btn_regDivice.setVisibility(View.VISIBLE);
btn_lockScreen.setVisibility(View.GONE);
btn_unRegDivice.setVisibility(View.GONE);
}
}
}
6.运行效果
只有一键锁屏权限时的激活页面显示:
按照第一步的device-admin.xml设置时的激活页面:
7.一键锁屏的运行逻辑:
点击权限配置进入应用,首先检查应用有没有激活系统管理器,若激活,则显示注销和锁屏按钮。此时点击“注销”则注销系统管理器并退出应用;点击“锁屏”则锁屏后退出应用。如果应用没有激活系统管理器,主页显示“注册组件”。点击后进入上图图一,点击“激活”,则应用获取系统管理员权限,页面显示“注销”和“锁屏”按钮;点击“取消”则返回“注册组件”页面。