Android:PackageManager.getSystemAvailableFeatures()在Nexus9上无法正常工作

时间:2015-01-22 07:09:43

标签: android camera android-camera android-5.0-lollipop

我正在尝试使用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;
    }

问题:

  1. Nexus9使用&拥有camera2 API功能?

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

  3. 提前感谢您的意见!

2 个答案:

答案 0 :(得分:1)

  

Nexus9使用&有camera2 API功能吗?

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

  

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

支持的API通常不包含在系统功能列表中。大多数系统功能都与设备之间的差异有关,通常与硬件功能(例如传感器,蓝牙,NFC等)或系统范围的软件支持(例如备份,设备管理,多用户等)有关。 。这里列出了所有支持的功能here

  

我做错了什么?

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

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

基本上,如果camera2 API不可用,此方法会返回null,因为Android的版本太旧(sdkVersion< 21)或者因为它们已从系统中删除(例如通过自定义ROM)。

答案 1 :(得分:0)

最后我能够得到我的问题的答案。

Nexus9使用&拥有camera2 API功能?

答案:是的,Nexus9正在使用Camera2 API。它具有LIMITED支持的硬件级别,并具有以下功能: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());