Vikasdeep Singh
Vikasdeep Singh

Reputation: 21766

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

I am trying to get all the available system features on my Nexus9 device using PackageManager.getSystemAvailableFeatures().

From Android 5.0 Lollipop, Google introduced new camera APIs (camera2). I think Nexus9 is using Camera2 APIs.

When I am running this API on Nexus9 device it is not listing camera2 APIs features like:

android.hardware.camera.level.full

android.hardware.camera.capability.manual_post_processing

android.hardware.camera.capability.manual_sensor

android.hardware.camera.capability.raw

I am using below code to get all the available features:

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;
    }

Questions:

  1. Is Nexus9 using & having camera2 API features?

  2. If answer is yes for above question, then Why it is not listing these system level features? I am doing something wrong?

Thanks for your comments in advance!

Upvotes: 0

Views: 2027

Answers (2)

Vikasdeep Singh
Vikasdeep Singh

Reputation: 21766

Finally I was able to get answers to my questions.

Is Nexus9 using & having camera2 API features?

Ans: Yes Nexus9 is having and using Camera2 APIs. It has LIMITED supported hardware level and has capabilities: BACKWARD_COMPATIBLE and MANUAL_SENSOR

If answer is yes for above question, then Why it is not listing these system level features? I am doing something wrong?

Ans: Because using above code I am listing features not capabilities. To list down the capabilities I used below code:

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

Upvotes: 0

Mike Laren
Mike Laren

Reputation: 8188

Is Nexus9 using & having camera2 API features?

Yes. All Android Lollipop devices and newer have the camera2 APIs.

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

Supported APIs are usually not included in the system features list. Most system features are related to things that can vary from device to device and are usually related to hardware features (e.g. sensors, bluetooth, NFC, etc) or system-wide software support (e.g. backup, device management, multi-user, etc). There's a list of all supported capabilities here.

I am doing something wrong?

According to the docs, the recommended way to check if the camera2 APIs exist is by requesting the camera service via:

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

Basically this method returns null if the camera2 APIs aren't available, either because the version of Android is too old (sdkVersion < 21) or because they've been removed from the system (e.g. via a custom ROM).

Upvotes: 1

Related Questions