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 plain copy print ?
  1. void updatePolicies() {  
  2.  SharedPreferences prefs = getSamplePreferences(this);  
  3.  final int pwQuality = prefs.getInt(PREF_PASSWORD_QUALITY,  
  4.  DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);  
  5.  final int pwLength = prefs.getInt(PREF_PASSWORD_LENGTH, 0);  
  6.  final int maxFailedPw = prefs.getInt(PREF_MAX_FAILED_PW, 0);  
  7.    
  8.  boolean active = mDPM.isAdminActive(mDeviceAdminSample);  
  9.  if (active) {  
  10.  mDPM.setPasswordQuality(mDeviceAdminSample, pwQuality);  
  11.  mDPM.setPasswordMinimumLength(mDeviceAdminSample, pwLength);  
  12.  mDPM.setMaximumFailedPasswordsForWipe(mDeviceAdminSample, maxFailedPw);  
  13.  }  
  14. }  

锁定设备方法:

[java]  view plain copy print ?
  1. mDPM.lockNow();  

清除所有用户数据(相当于Master Reset)

[java]  view plain copy print ?
  1. 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>


相关文章
|
16天前
|
Android开发 开发者
安卓投屏神器 Scrcpy安 报错ERROR: Could not find any ADB device
使用Scrcpy安卓投屏工具时遇到报错,问题根源是未开启开发者模式。解决步骤:进入设置,点击【关于手机】→连续点击版本号激活开发者模式,然后在【系统设置】→【开发者选项】中开启USB调试。参照此方法后可正常执行。Scrcpy软件下载链接和GitHub页面也已提供。
26 1
|
8月前
|
Android开发
Android 中String.format()的用法
Android 中String.format()的用法
54 0
|
11月前
|
JSON Android开发 数据格式
Android:解析Json异常 Expected a string but was BEGIN_OBJECT at
今天解析后端数据时,发现了这个报错:Expected BEGIN_OBJECT but was STRING at 看来是自己哪儿解析错误了。 因为数据的特殊性,后端返回的Json串里面可能还会有Json数据,可能嵌套了三次层,
|
Android开发
android String.xlm中使用emoji表情的方法
android 要在TextView中加入emoji的方法有多种,比较常见便捷的是在String.xml加上emoji的UniCode编码
253 0
android String.xlm中使用emoji表情的方法
|
12月前
|
缓存 安全 Java
Android C++系列:string最佳实践
在C语言中我们操作String要相对麻烦些,每次字符串拼接都要重新开辟空间,再把数据拷贝进去,使用上没有那么便捷。
206 0
|
Android开发
Android TextView.setText() 实现字符串(String)+数值(Integer)作为参数
Android TextView.setText() 实现字符串(String)+数值(Integer)作为参数
|
开发工具 Android开发
Android Studio 运行时 Device Chooser为空怎么办?
Android Studio 运行时 Device Chooser为空怎么办?
Android Studio 运行时 Device Chooser为空怎么办?
|
API Android开发
Android Studio 在运行时 Device Chooser为空怎么办?
Android Studio 在运行时 Device Chooser为空怎么办?
Android Studio 在运行时 Device Chooser为空怎么办?
|
XML 文件存储 数据库
android retrofit 请求返回String数据中文乱码解决方案
问题来源 focus 应用中核心的部分是,网络请求订阅的xml文件内容,然后解析xml文件存储到本地数据库。
382 0
android retrofit 请求返回String数据中文乱码解决方案
YL.
|
XML Java Android开发
Android String Resouse
详细记录一下Android Application 中字符串资源的使用
YL.
156 2