天天看點

android Device Admin以及hasSystemFeature(String string)

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 ,用來判斷目前裝置使用者是否為一隻猴子:-)。真不知道如果來判斷,我以為如果這是亂敲鍵盤會使這個函數傳回“真”。結果不是:)。

總的來說這些類和方法在一般的應用中用到的地方很少,有些印象就可以了。

android Device Admin以及hasSystemFeature(String string)

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>

繼續閱讀