device admin示例介紹了類deviceadminreceiver,devicepolicymanager和activitymanager。
類devicepolicymanager 用于管理android裝置定義的一些政策,主要指密碼定義的長度,密碼是否要含大寫字母,小寫字母等設定密碼需要滿足的規範,鎖定裝置或是清除所有使用者資料,這個類一般需要配合deviceadminreceiver來使用。deviceadminreceiver派生于broadcastreceiver,可以接受android作業系統發出的intent事件:如密碼過期了,密碼更新等。
當它publish在androidmanifest.xml作為broadcastreceiver定義時,必須處理android.app.action.device_admin_enabled和設定android.permission.bind_device_admin權限:
<receiver android:name=”.app.deviceadminsample”
android:label=”@string/sample_device_admin”
android:description=”@string/sample_device_admin_description”
android:permission=”android.permission.bind_device_admin”>
<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>
使用devicepolicymanager 來設定密碼定義的policy
[java] view
plaincopyprint?
void updatepolicies() {
sharedpreferences prefs = getsamplepreferences(this);
final int pwquality = prefs.getint(pref_password_quality,
devicepolicymanager.password_quality_unspecified);
final int pwlength = prefs.getint(pref_password_length, 0);
final int maxfailedpw = prefs.getint(pref_max_failed_pw, 0);
boolean active = mdpm.isadminactive(mdeviceadminsample);
if (active) {
mdpm.setpasswordquality(mdeviceadminsample, pwquality);
mdpm.setpasswordminimumlength(mdeviceadminsample, pwlength);
mdpm.setmaximumfailedpasswordsforwipe(mdeviceadminsample, maxfailedpw);
}
}
鎖定裝置方法:
mdpm.locknow();
清除所有使用者資料(相當于master reset)
mdpm.wipedata(0);
activitymanager類一般用來擷取android系統中所有運作的activity的資訊,有點類似windows中的task manager。可以獲得 memory ,process ,service等資訊。而在例子中使用了一個很好笑的方法:isuseramonkey ,用來判斷目前裝置使用者是否為一隻猴子:-)。真不知道如果來判斷,我以為如果這是亂敲鍵盤會使這個函數傳回“真”。結果不是:)。
總的來說這些類和方法在一般的應用中用到的地方很少,有些印象就可以了。

hassystemfeature函數
(frameworks\base\services\java\com\android\server\pm) mpm.hassystemfeature(name)經過aidl實際上調用到檔案packagemanagerservice.java 。
mavailablefeatures裡面的内容是通過讀取/system/etc/permissions下面的文檔。
延伸:
android4.0 及以上 版本裡 ,如果在settings下看不到wifi和bluetooth兩個菜單選項,這是因為在setting裡,對系統是否有特定的子產品加上了判斷,如果沒有就不顯示。android4.0的子產品判斷函數:getpackagemanager().hassystemfeature(string string).通過該函數判斷系統是否有特定的子產品功能。
例如判斷是否有 wifi 和 藍牙子產品的具體代碼:
getpackagemanager().hassystemfeature(packagemanager.feature_wifi);
getpackagemanager().hassystemfe(packagemanager.feature_bluetooth);
packagemanager這些字元串 存在system/etc/permissions/xxxx.xml檔案裡,它們一般從/framework/base/data/etc/xxx.xml複制過來。
packagemanager.feature_bluetooth = "android.hardware.wifi"
packagemanager.feature_bluetooth = "android.hardware.bluetooth"
解決wifi和藍牙不顯示方法:
一、直接把包含對應 feature 的xml檔案複制到system/etc/permissions/目錄下,相當于加上系統所具有的具體子產品的功能配置檔案;
二、修改product_copy.mk檔案,添加相應的裝置。
++++++++++++++++++++++++++++++++++++++++++
相關方法如下:
featureinfo[] packagemanager.getsystemavailablefeatures()
boolean packagemanager.hassystemfeature(string feature)
範例:
packagemanager pm = context.getpackagemanager();
featureinfo[] features = pm.getsystemavailablefeatures(); //得到所有支援的硬體種類
for (featureinfo feature : features) log.v(tag, feature.name);
boolean hasflashlight = pm.hsasystemfeature(packagemanager.feature_camera_flash); //是否支援閃光燈
boolean hascamera = pm.hsasystemfeature(packagemanager.feature_camera); //是否支援相機
boolean hasbt = pm.hsasystemfeature(packagemanager.feature_bluetooth); //是否支援藍牙
hassystemfeature 這個接口參考資訊是
/system/etc/permissions/android.hardware*.xml 檔案中定義的feature的資訊
/frameworks/base/data/etc/android.hardware.camera.flash-autofocus.xml
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<feature name="android.hardware.camera" />
<feature name="android.hardware.camera.autofocus" />
<feature name="android.hardware.camera.flash" />
</permissions>