86
汽車大全
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
- 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 ,用來判斷當前設備使用者是否為一隻猴子:-)。真不知道如果來判斷,我以為如果這是亂敲鍵盤會使這個函數返回“真”。結果不是:)。
總的來說這些類和方法在一般的應用中用到的地方很少,有些印象就可以了。
(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>
最後更新:2017-04-03 05:39:37