Android註冊裝置管理器(獲取超級管理員許可權)
阿新 • • 發佈:2019-01-28
注意:一旦一個應用開啟了超級管理員許可權,是不能直接在 設定--->應用程式裡 進行刪除的(刪除失敗)
必須要在 設定--->位置和安全--->選擇裝置管理器 裡取消要刪除應用的啟用 然後再去應用程式裡刪除
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();//鎖屏
}
}
圖一:
圖二: