歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android設備管理員——DevicePolicyManager

Android 2.2 SDK提供了一個可管理和操作設備的API叫DevicePolicyManager,使用這個API你可以接管手機的應用權限,對手機做出很多大膽的操作,比如鎖屏、恢復出廠設置、設置密碼、強制清除密碼,修改密碼、設置屏幕燈光漸暗時間間隔等操作。

這個API讓你的程序直接掌握了系統的命脈。

但是,同樣的道理,別人也可以做類似的程序,各程序之間的權限是不起沖突的~

首先,要想調用DevicePolicyManager,那麼我們必須先要注冊一個admin,如何注冊呢,也是需要通過代碼去注冊。有了admin權限,我們才可能對系統進行上述功能的操作。

其次,程序在啟動激活的時候,會給用戶相應提示,只有當用戶點擊“激活”後,我們的代碼才能真正的運轉。(其實我也想跳過用戶激活操作,但是還沒研究出來...如果成功了,那就算是真正的成功了)

再有,就是創建權限啊,監聽了。

下面來看代碼:

第一步,注冊一個廣播類,用於監聽權限的變化:

  1. <receiver android:name=".deviceAdminReceiver" android:label="@string/app_name"  
  2.     android:description="@string/description" android:permission="android.permission.BIND_DEVICE_ADMIN">  
  3.   
  4.     <meta-data android:name="android.app.device_admin"  
  5.                 android:resource="@xml/device_admin" />  
  6.   
  7.     <intent-filter>  
  8.         <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />  
  9.     </intent-filter>  
  10.   
  11. </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清單:

  1. <span style="color:#000000;"><?xml version="1.0" encoding="utf-8"?>  
  2. <device-admin xmlns:android="<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>">   
  3.  <uses-policies>  
  4.    <limit-password />  
  5.         <watch-login />  
  6.         <reset-password />  
  7.         <force-lock />  
  8.         <wipe-data />  
  9.    </uses-policies>  
  10. </device-admin></span>  

<uses-policies></uses-policies>中間的內容是可以不要的。

因為這部分是系統給的提示語,而我們在自己做程序的時候,可以輸入自己想寫的內容。

第二步,廣播服務類的JAVA代碼,重寫一些必要的實現函數:

廣播類deviceAdminReceiver 繼承DeviceAdminReceiver

  1. package cn.etzmico;  
  2.   
  3. import android.app.admin.DeviceAdminReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.SharedPreferences;  
  7. import android.widget.Toast;  
  8.   
  9. public class deviceAdminReceiver extends DeviceAdminReceiver {  
  10.   
  11.     /** 
  12.      * 獲取設備存儲的數值 
  13.      *  
  14.      * @param context 
  15.      * @return 
  16.      */  
  17.     public static SharedPreferences getDevicePreference(Context context) {  
  18.         return context.getSharedPreferences(  
  19.                 DeviceAdminReceiver.class.getName(), 0);  
  20.     }  
  21.   
  22.     // 密碼的特點   
  23.     public static String PREF_PASSWORD_QUALITY = "password_quality";  
  24.     // 密碼的長度   
  25.     public static String PREF_PASSWORD_LENGTH = "password_length";  
  26.   
  27.     public static String PREF_MAX_FAILED_PW = "max_failed_pw";  
  28.   
  29.     void showToast(Context context, CharSequence text) {  
  30.         Toast.makeText(context, text, Toast.LENGTH_SHORT).show();  
  31.     }  
  32.   
  33.     @Override  
  34.     public void onEnabled(Context context, Intent intent) {  
  35.         // TODO Auto-generated method stub   
  36.         showToast(context, "設備管理:可用");  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onDisabled(Context context, Intent intent) {  
  41.         // TODO Auto-generated method stub   
  42.         showToast(context, "設備管理:不可用");  
  43.     }  
  44.   
  45.     @Override  
  46.     public CharSequence onDisableRequested(Context context, Intent intent) {  
  47.         // TODO Auto-generated method stub   
  48.         return "這是一個可選的消息,警告有關禁止用戶的請求";  
  49.     }  
  50.   
  51.     @Override  
  52.     public void onPasswordChanged(Context context, Intent intent) {  
  53.         // TODO Auto-generated method stub   
  54.         showToast(context, "設備管理:密碼己經改變");  
  55.     }  
  56.   
  57.     @Override  
  58.     public void onPasswordFailed(Context context, Intent intent) {  
  59.         // TODO Auto-generated method stub   
  60.         showToast(context, "設備管理:改變密碼失敗");  
  61.     }  
  62.   
  63.     @Override  
  64.     public void onPasswordSucceeded(Context context, Intent intent) {  
  65.         // TODO Auto-generated method stub   
  66.         showToast(context, "設備管理:改變密碼成功");  
  67.     }  
  68.   
  69. }  

第三步,也就是最關鍵的操作代碼了

激活相關

  1. Intent intent = new Intent(  
  2.         DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
  3. intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,  
  4.         mDeviceComponentName);  
  5. intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,  
  6.         "(自定義區域2)");  
  7. startActivityForResult(intent, RESULT_ENABLE);  

代碼中的自定義區域2是可以輸入一些自己想說的話,和廣播類中的android:description="@string/description"一樣。

這個是系統提供的兩個自定義區域。

  1. <string name="description">(可自定義區域1)</string>  

鎖屏相關

  1. mDPM.lockNow();  

鎖屏操作,由於是模擬器不能做到真正錯屏,只能停到初始模擬器進來需要解鎖的狀態,屏幕不會變暗。

設置屏幕燈光變暗時間相關

  1. long timeout = 1000L * Long.parseLong(et.getText().toString());  
  2. mDPM.setMaximumTimeToLock(mDeviceComponentName, timeout);  
  3. mDPM.wipeData(0);  

et是定義的一個EditText,用於進行時間的輸入

屏幕變暗最小時間為5秒

恢復出廠設置相關

  1. mDPM.wipeData(0);  

恢復出廠設置只能通過真機去操作,模擬器操作後會停留在正在關機的dialog畫面

恢復後數據會被清空,因此要做好備份操作

Copyright © Linux教程網 All Rights Reserved