Android 2.2 SDK提供了一個可管理和操作設備的API叫DevicePolicyManager,使用這個API你可以接管手機的應用權限,對手機做出很多大膽的操作,比如鎖屏、恢復出廠設置、設置密碼、強制清除密碼,修改密碼、設置屏幕燈光漸暗時間間隔等操作。
這個API讓你的程序直接掌握了系統的命脈。
但是,同樣的道理,別人也可以做類似的程序,各程序之間的權限是不起沖突的~
首先,要想調用DevicePolicyManager,那麼我們必須先要注冊一個admin,如何注冊呢,也是需要通過代碼去注冊。有了admin權限,我們才可能對系統進行上述功能的操作。
其次,程序在啟動激活的時候,會給用戶相應提示,只有當用戶點擊“激活”後,我們的代碼才能真正的運轉。(其實我也想跳過用戶激活操作,但是還沒研究出來...如果成功了,那就算是真正的成功了)
再有,就是創建權限啊,監聽了。
下面來看代碼:
第一步,注冊一個廣播類,用於監聽權限的變化:
- <receiver android:name=".deviceAdminReceiver" android:label="@string/app_name"
- android:description="@string/description" android:permission="android.permission.BIND_DEVICE_ADMIN">
-
- <meta-data android:name="android.app.device_admin"
- android:resource="@xml/device_admin" />
-
- <intent-filter>
- <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
- </intent-filter>
-
- </receiver>
android:permission 表示此功能需要的權限。
android:name="android.app.action.DEVICE_ADMIN_ENABLED"表示此動作的跳轉界面。
<meta-data android:name="android.app.device_admin"android:resource="@xml/device_admin" />表示這個應用可以管理的權限清單。
XML清單:
- <span style="color:#000000;"><?xml version="1.0" encoding="utf-8"?>
- <device-admin xmlns:android="<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>">
- <uses-policies>
- <limit-password />
- <watch-login />
- <reset-password />
- <force-lock />
- <wipe-data />
- </uses-policies>
- </device-admin></span>
<uses-policies></uses-policies>中間的內容是可以不要的。
因為這部分是系統給的提示語,而我們在自己做程序的時候,可以輸入自己想寫的內容。
第二步,廣播服務類的JAVA代碼,重寫一些必要的實現函數:
廣播類deviceAdminReceiver 繼承DeviceAdminReceiver
- package cn.etzmico;
-
- import android.app.admin.DeviceAdminReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.widget.Toast;
-
- public class deviceAdminReceiver extends DeviceAdminReceiver {
-
- /**
- * 獲取設備存儲的數值
- *
- * @param context
- * @return
- */
- public static SharedPreferences getDevicePreference(Context context) {
- return context.getSharedPreferences(
- DeviceAdminReceiver.class.getName(), 0);
- }
-
- // 密碼的特點
- public static String PREF_PASSWORD_QUALITY = "password_quality";
- // 密碼的長度
- public static String PREF_PASSWORD_LENGTH = "password_length";
-
- public static String PREF_MAX_FAILED_PW = "max_failed_pw";
-
- void showToast(Context context, CharSequence text) {
- Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void onEnabled(Context context, Intent intent) {
- // TODO Auto-generated method stub
- showToast(context, "設備管理:可用");
- }
-
- @Override
- public void onDisabled(Context context, Intent intent) {
- // TODO Auto-generated method stub
- showToast(context, "設備管理:不可用");
- }
-
- @Override
- public CharSequence onDisableRequested(Context context, Intent intent) {
- // TODO Auto-generated method stub
- return "這是一個可選的消息,警告有關禁止用戶的請求";
- }
-
- @Override
- public void onPasswordChanged(Context context, Intent intent) {
- // TODO Auto-generated method stub
- showToast(context, "設備管理:密碼己經改變");
- }
-
- @Override
- public void onPasswordFailed(Context context, Intent intent) {
- // TODO Auto-generated method stub
- showToast(context, "設備管理:改變密碼失敗");
- }
-
- @Override
- public void onPasswordSucceeded(Context context, Intent intent) {
- // TODO Auto-generated method stub
- showToast(context, "設備管理:改變密碼成功");
- }
-
- }
第三步,也就是最關鍵的操作代碼了
激活相關
- Intent intent = new Intent(
- DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
- intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
- mDeviceComponentName);
- intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
- "(自定義區域2)");
- startActivityForResult(intent, RESULT_ENABLE);
代碼中的自定義區域2是可以輸入一些自己想說的話,和廣播類中的android:description="@string/description"一樣。
這個是系統提供的兩個自定義區域。
- <string name="description">(可自定義區域1)</string>
鎖屏相關
- mDPM.lockNow();
鎖屏操作,由於是模擬器不能做到真正錯屏,只能停到初始模擬器進來需要解鎖的狀態,屏幕不會變暗。
設置屏幕燈光變暗時間相關
- long timeout = 1000L * Long.parseLong(et.getText().toString());
- mDPM.setMaximumTimeToLock(mDeviceComponentName, timeout);
- mDPM.wipeData(0);
et是定義的一個EditText,用於進行時間的輸入
屏幕變暗最小時間為5秒
恢復出廠設置相關
- mDPM.wipeData(0);
恢復出廠設置只能通過真機去操作,模擬器操作後會停留在正在關機的dialog畫面
恢復後數據會被清空,因此要做好備份操作