注意:一旦一个应用开启了超级管理员权限,是不能直接在 设置--->应用程序里 进行删除的(删除失败)
必须要在 设置--->位置和安全--->选择设备管理器 里取消要删除应用的激活 然后再去应用程序里删除
1.创建一个DeviceAdminReceiver子类(DeviceAdminReceiver是广播接收者的子类)
import android.app.admin.DeviceAdminReceiver;
public class MyAdmin extends DeviceAdminReceiver {
}
2.配置广播接收者清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxc.lockscreen"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.xxc.lockscreen.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.xxc.lockscreen.MyAdmin"
android:description="@string/sample_device_admin_description"
android:label="@string/sample_device_admin"
android:permission="android.permission.BIND_DEVICE_ADMIN" ><!-- description和label都是strings.xml里配置的 -->
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
</application>
</manifest>
values目录下的strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">一键锁屏</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="sample_device_admin_description">此应用用于锁屏</string><!-- 见图一 -->
<string name="sample_device_admin">锁屏</string><!-- 见图一 -->
</resources>
3.在res目录下创建xml文件夹,再此文件夹里创建device_admin_sample.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 />
</uses-policies>
</device-admin>
4.在Activity里调用
package com.xxc.lockscreen;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
/**
* 步骤:
* 1.创建一个类继承DeviceAdminReceiver
* 2.因为DeviceAdminReceiver是一个广播接收者,那么就需要在清单文件里配置receiver
* <receiver
android:name="com.xxc.lockscreen.MyAdmin"
android:description="@string/sample_device_admin_description" //描述信息
android:label="@string/sample_device_admin" //标签名称
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample" /> //在res下创建xml文件夹,并创建device_admin_sample.xml文件
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
*3.device_admin_sample.xml文件内容为:
*<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 />
</uses-policies>
</device-admin>
*
*4.设置--->设备管理器--->将锁屏程序勾选激活
*
*5.而让一般的用户手动执行第四步会感觉很繁琐,所以在界面上加一个CheckBox组件,直接完成第四步的操作
*/
public class MainActivity extends Activity {
private DevicePolicyManager dpm;
private CheckBox cb_status;
private ComponentName mDeviceAdminSample;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);//设备策略管理器
cb_status = (CheckBox) findViewById(R.id.cb_status);//复选框组件
//第一个参数 上下文 第二个参数 需要被激活的超级管理员类
mDeviceAdminSample = new ComponentName(getApplicationContext(), MyAdmin.class);
isOpen();//判断是否激活,再进行对应的数据回显
cb_status.setOnCheckedChangeListener(new OnCheckedChangeListener() {//多选框勾选状态改变的监听器
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//以下这段都是API上复制的
if(isChecked){//多选框被勾选,激活超级管理员
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"开启后就可以使用锁屏功能了...");//显示位置见图二
/*
* 不能直接startActivity 因为可能在激活的时候用户点击了取消,这时候CheckBox状态是勾选的,但是实际是没激活的,
* 所以要等打开的Activity关闭后的回调函数里去判断是否真正激活,再对CheckBox状态进行改变
*/
startActivityForResult(intent, 0);
}else{//多选框取消勾选,取消激活超级管理员
dpm.removeActiveAdmin(mDeviceAdminSample);
}
}
});
}
/**
* 关闭激活Activity后的回调函数
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
isOpen();
}
/**
* 检测用户是否开启了超级管理员
*/
private void isOpen() {
if(dpm.isAdminActive(mDeviceAdminSample)){//判断超级管理员是否激活
cb_status.setChecked(true);
}else{
cb_status.setChecked(false);
}
}
public void screenLock(View view){
dpm.lockNow();//锁屏
}
}
图一:
图二: