Android: PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作

Android: PackageManager.getSystemAvailableFeatures() is not working as expected on Nexus9

我正在尝试使用 PackageManager.getSystemAvailableFeatures() 在我的 Nexus9 设备上获取所有可用的系统功能。

来自 Android 5.0 Lollipop,Google 引入 new camera APIs (camera2)。我认为 Nexus9 使用的是 Camera2 APIs.

当我在 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;
    }

问题:

  1. Nexus9 是否使用并具有 camera2 API 功能?

  2. 如果上述问题的答案是肯定的,那么为什么不列出这些系统级功能?我做错了什么?

提前感谢您的意见!

Is Nexus9 using & having camera2 API features?

是的。所有 Android Lollipop 设备和更新的设备都具有 camera2 API。

If answer is yes for above question, then Why it is not listing these system level features?

支持的 API 通常不包含在系统功能列表中。大多数系统功能都与不同设备相关,通常与硬件功能(例如传感器、蓝牙、NFC 等)或系统范围的软件支持(例如备份、设备管理、多用户等)相关.有一个所有支持功能的列表 here

I am doing something wrong?

根据 docs,检查 camera2 API 是否存在的推荐方法是通过以下方式请求相机服务:

CameraManager cameraManager = (CameraManager) getSystemService("camera");

基本上这个方法 returns null 如果 camera2 API 不可用,要么是因为 Android 的版本太旧(sdkVersion < 21),要么是因为他们已经已从系统中删除(例如通过自定义 ROM)。

我终于找到了问题的答案。

Nexus9 是否使用并具有 camera2 API 功能?

A​​ns:是的,Nexus9 正在使用 Camera2 APIs。它具有 LIMITED 支持的硬件级别并具有以下功能:BACKWARD_COMPATIBLE 和 MANUAL_SENSOR

如果上述问题的答案是肯定的,那么为什么不列出这些系统级功能?我做错了什么?

A​​ns:因为使用上面的代码,我列出的是特性而不是功能。列出我在下面代码中使用的功能:

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());