Android註冊裝置管理器(獲取超級管理員許可權)

我叫阿狸貓發表於2014-03-06

注意:一旦一個應用開啟了超級管理員許可權,是不能直接在  設定--->應用程式裡  進行刪除的(刪除失敗)   

必須要在  設定--->位置和安全--->選擇裝置管理器  裡取消要刪除應用的啟用  然後再去應用程式裡刪除

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();//鎖屏
	}
}


圖一:


圖二:







相關文章