關於DevicePolicyManager申請系統管理許可權
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
自從安卓2.2(API=8)以後,安卓手機是通過裝置管理API對手機進行系統級的裝置管理。
本篇通過大家熟悉的“一鍵鎖屏”的小專案實現來介紹裝置管理API如何通過強制裝置管理策略建立一個安全敏感的應用程式。
一鍵鎖屏的實現原理:當按鎖屏鍵的時候,會發出一個廣播,當用戶介面接收到一個廣播的時候就可以實現鎖屏。而廣播的傳送是我們呼叫DevicePolicyManager(裝置管理接收者)中的lockNow()方法來實現。
鎖屏需要將應用程式提升為系統管理員的許可權,如果當前的應用具備系統管理員的許可權,則直接呼叫lockNow()進行鎖屏;如果應用是首次執行不具備系統管理員許可權,則需要啟用一個使用者授權介面來讓使用者進行手動授權(重點)。
所以,一鍵鎖屏的關鍵點就在於如何授權。
將應用程式具備系統管理員許可權的做法:寫一個廣播的接收者,讓該廣播接受者去申請系統管理員的許可權,讓作業系統給廣播接收者授權(其實就是去啟用系統的授權元件),給使用者自己啟用。
實現流程:
關鍵的類:
1.DeviceAdminReceiver:裝置管理接收者,該類提供了系統發出的意圖動作。你的裝置管理應用程式必須包含一個DeviceAdminReceiver 的子類。代表著手機上的裝置管理器。
2.DevicePolicyManager 裝置管理員
以下是根據流程寫出的程式碼:
在MainActivity 主類中:
1 public class MainActivity extends Activity { 2 3 privateDevicePolicyManager manger; 4 private ComponentName componentName; 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 //1.獲取裝置管理接收者11 manger=(DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);12 13 //2.申請許可權14 //MyAdmin 這個類是繼承了DeviceAdminReceiver 15 componentName=new ComponentName(this, MyAdmin.class);16 17 //3.實現鎖屏(這裡封裝成一個方法)18 lock();19 20 //4.鎖屏之後殺掉我們自己的Activity,避免資源的浪費21 android.os.Process.killProcess(android.os.Process.myPid());22 }23 24 private void lock() {25 //判斷該元件是否有系統管理員的許可權26 27 boolean active=manger.isAdminActive(componentName);28 if(active){29 //已獲得管理員的許可權,則直接鎖屏30 manger.lockNow();31 }else {32 //沒有管理員的許可權,則獲取管理員的許可權33 Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);34 intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);35 //會在啟用介面中顯示的額外內容36 intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "----這是一鍵鎖屏啟用介面-----");37 startActivityForResult(intent, 0);38 39 //鎖屏40 manger.lockNow();41 }42 43 }44 45 @Override46 public boolean onCreateOptionsMenu(Menu menu) {47 // Inflate the menu; this adds items to the action bar if it is present.48 getMenuInflater().inflate(R.menu.main, menu);49 return true;50 }51 52 }
定義並宣告你的策略:在res/xml/lock.xml中宣告所選擇的策略集,它將會被程式強行實行。如果一個程式嘗試呼叫在XML中沒有對應策略的方法,
這將會在執行時導致一個*SecurityException*異常。如果程式打算管理其他策略,那麼其他許可權,例如'_強制鎖(force-lock)。
如下程式碼片段在res/xml/lock.xml中聲明瞭密碼限制策略:
<?xml version="1.0" encoding="UTF-8"?><device-admin xmlns:android="http://schemas.android.com/apk/res/android" > <uses-policies> <!-- 鎖定螢幕 --> <force-lock /> </uses-policies></device-admin>
在 Android manifest(清單檔案) 中引用XML策略宣告:
<!-- 引用xml策略宣告 --> <receiver android:name=".MyAdmin" android:description="@string/app_name" android:label="@string/app_name" android:permission="android.permission.BIND_DEVICE_ADMIN" > <meta-data android:name="android.app.device_admin" android:resource="@xml/lock" /> <intent-filter > <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver>
整個Android manifest(清單檔案) :
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mylock" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.mylock.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> <!-- 引用xml策略宣告 --> <receiver android:name=".MyAdmin" android:description="@string/app_name" android:label="@string/app_name" android:permission="android.permission.BIND_DEVICE_ADMIN" > <meta-data android:name="android.app.device_admin" android:resource="@xml/lock" /> <intent-filter > <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver> </application></manifest>
啟用裝置管理員
好了。以上程式碼部署在模擬器中執行後,點選程式圖示,將來到使用者啟用檢視
如果使用者選擇"Activate",程式就會成為裝置管理員並且可以開始配置及強制執行策略。再次執行程式將會實現一鍵鎖屏。
如果使用者選擇"Cancle" 將會取消。
參考谷歌的API:
http://developer.android.com/guide/topics/admin/device-admin.html#lock