Android激活设备管理器--一键锁屏

激活设备管理器就是把系统的某些权力例如锁屏,链接蓝牙等功能交给某个应用来执行。也就是说,如果想要某个应用执行某些系统超级管理员才能执行的功能时,就需要让这个应用激活设备管理器。此时该应用就拿到了系统管理员的权限。

这件事要怎么做呢?

写一个广播接收者,给这个BroadcastReceiver申请系统管理员的权限,让操作系统给广播接收者授权。这样就激活了系统的授权组件。这些功能都是由android提供的DevicePolicyManager类来完成的。

下面用申请应用系统管理员以及一键锁屏来介绍这个权限操作。

1.首先创建自定义的权限xml文件– device_admin.xml
在Android工程的res目录下新建xml目录,在xml目录下新建device_admin.xml文件


<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.创建布局文件,主要是定义三个按钮:注册组件,注销组件和锁屏。


<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.运行效果
只有一键锁屏权限时的激活页面显示:Android激活设备管理器--一键锁屏_第1张图片
按照第一步的device-admin.xml设置时的激活页面:Android激活设备管理器--一键锁屏_第2张图片

7.一键锁屏的运行逻辑:
点击权限配置进入应用,首先检查应用有没有激活系统管理器,若激活,则显示注销和锁屏按钮。此时点击“注销”则注销系统管理器并退出应用;点击“锁屏”则锁屏后退出应用。如果应用没有激活系统管理器,主页显示“注册组件”。点击后进入上图图一,点击“激活”,则应用获取系统管理员权限,页面显示“注销”和“锁屏”按钮;点击“取消”则返回“注册组件”页面。

你可能感兴趣的:(android)