Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作
Posted
技术标签:
【中文标题】Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作【英文标题】:Android: PackageManager.getSystemAvailableFeatures() is not working as expected on Nexus9 【发布时间】:2015-03-20 21:48:21 【问题描述】:我正在尝试使用PackageManager.getSystemAvailableFeatures() 在我的 Nexus9 设备上获取所有可用的系统功能。
从 android 5.0 Lollipop 开始,Google 引入了new camera APIs (camera2)。我认为 Nexus9 正在使用 Camera2 API。
当我在 Nexus9 设备上运行此 API 时,它没有列出 camera2 API 功能,例如:
android.hardware.camera.level.full
android.hardware.camera.capability.manual_post_processing
android.hardware.camera.capability.manual_sensor
android.hardware.camera.capability.raw
我正在使用以下代码来获取所有可用功能:
public final static boolean isFeatureAvailable(Context context, String feature)
final PackageManager packageManager = context.getPackageManager();
final FeatureInfo[] featuresList = packageManager.getSystemAvailableFeatures();
for (FeatureInfo f : featuresList)
if (f.name != null && f.name.equals(feature))
return true;
return false;
问题:
Nexus9 是否使用并拥有 camera2 API 功能?
如果上述问题的答案是肯定的,那么为什么没有列出这些系统级功能?我做错了什么?
提前感谢您的 cmets!
【问题讨论】:
【参考方案1】:Nexus9 是否使用并拥有 camera2 API 功能?
是的。所有 Android Lollipop 设备和更新的设备都有 camera2 API。
如果上述问题的答案是肯定的,那么为什么没有列出这些系统级功能?
支持的 API 通常不包含在系统功能列表中。大多数系统功能都与因设备而异的事物相关,通常与硬件功能(例如传感器、蓝牙、NFC 等)或系统范围的软件支持(例如备份、设备管理、多用户等)有关.有一个所有受支持功能的列表here。
我做错了什么?
根据docs,检查camera2 API是否存在的推荐方法是通过以下方式请求相机服务:
CameraManager cameraManager = (CameraManager) getSystemService("camera");
如果 camera2 API 不可用,这个方法基本上会返回 null
,要么是因为 Android 版本太旧(sdkVersion
【讨论】:
迈克,谢谢你的回答。它有部分帮助。是的,您是,这些是设备功能而不是功能。以及如何获取有关这些能力的信息可以通过使用 CameraCharacteristics 类来实现。我已经发布了详细的答案。【参考方案2】:我终于能够得到我的问题的答案。
Nexus9 是否使用并拥有 camera2 API 功能?
Ans:是的,Nexus9 拥有并使用 Camera2 API。它具有有限支持的硬件级别并具有以下功能:BACKWARD_COMPATIBLE 和 MANUAL_SENSOR
如果上述问题的答案是肯定的,那么为什么没有列出这些系统级功能?我做错了什么?
Ans:因为使用上面的代码,我列出的是功能而不是功能。列出我在下面的代码中使用的功能:
Activity activity = getActivity();
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
try
for (String cameraId : manager.getCameraIdList())
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(cameraId);
if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
Log.d("Camera2 SUPPORTED_HARDWARE_LEVEL: ", "FULL");
else if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
Log.d("Camera2 SUPPORTED_HARDWARE_LEVEL: ", "LEGACY");
else if(characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
Log.d("Camera2 SUPPORTED_HARDWARE_LEVEL: ", "LIMITED");
StringBuilder stringBuilder = new StringBuilder();
for (int i=0; i<characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES).length; i++)
if(characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)
stringBuilder.append("BACKWARD_COMPATIBLE" + " ");
else if (characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING)
stringBuilder.append("MANUAL_POST_PROCESSING" + " ");
else if(characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)
stringBuilder.append("MANUAL_SENSOR" + " ");
else if (characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)
stringBuilder.append("RAW" + " ");
Log.d("Camera2: ", stringBuilder.toString());
【讨论】:
以上是关于Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )