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>