1. 程式人生 > >關於DevicePolicyManager申請系統管理許可權

關於DevicePolicyManager申請系統管理許可權

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

自從安卓2.2API=8)以後,安卓手機是通過裝置管理API對手機進行系統級的裝置管理。

本篇通過大家熟悉的“一鍵鎖屏”的小專案實現來介紹裝置管理API如何通過強制裝置管理策略建立一個安全敏感的應用程式。

 

一鍵鎖屏的實現原理:當按鎖屏鍵的時候,會發出一個廣播,當用戶介面接收到一個廣播的時候就可以實現鎖屏。而廣播的傳送是我們呼叫DevicePolicyManager(裝置管理接收者)中的lockNow()方法來實現。

 

鎖屏需要將應用程式提升為系統管理員的許可權,如果當前的應用具備系統管理員的許可權,則直接呼叫lockNow()進行鎖屏;如果應用是首次執行不具備系統管理員許可權,則需要啟用一個使用者授權介面來讓使用者進行手動授權(重點)。

所以,一鍵鎖屏的關鍵點就在於如何授權。

 

將應用程式具備系統管理員許可權的做法:寫一個廣播的接收者,讓該廣播接受者去申請系統管理員的許可權,讓作業系統給廣播接收者授權(其實就是去啟用系統的授權元件),給使用者自己啟用。

實現流程:

 

關鍵的類:

1.DeviceAdminReceiver:裝置管理接收者,該類提供了系統發出的意圖動作。你的裝置管理應用程式必須包含一個DeviceAdminReceiver 的子類。代表著手機上的裝置管理器。

2.DevicePolicyManager  裝置管理員

以下是根據流程寫出的程式碼:

在MainActivity 主類中:

 1 public class MainActivity extends Activity { 2  3     private
DevicePolicyManager 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

 


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述