Android: Check whether camera supports auto-focus?

北慕城南 提交于 2019-11-30 08:12:22
List<String> supportedFocusModes = camera.getParameters().getSupportedFocusModes();
boolean hasAutoFocus = supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)

i'm guessing: Do not use the unknown constant.

getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS)

Should be:

getPackageManager().hasSystemFeature("android.hardware.camera.autofocus")

It was a short sight of the developers to use constants here. It solves the problem of knowing if a device, running an API that knows about a feature has a feature. but fails on the case you just mentioned... they really make supporting multiple api levels difficult.

Updated: just tested it myself... PackageManager.hasSystemFeature() only showed up at API level 5. I was trying to add that check to my code that can very well support API level 3 (1.5) but which could benefit from camera's auto focus...seems like i have to choose support 1.5 or be able to use auto focus... or move my backward compatibility to level 5... or implement this http://www.java.net/forum/topic/java-tools/java-development-tools/wwyt-conditional-compilation-pre-process ...yeah, right.

they really make it difficult to support multiple versions. So sorry 1.5 and 1.6 and 2.0 users. since my device is on 2.2 that will be my bottom line.

Jaya
   private void getSuppourtedFocusedModes(Camera camera) 
   {
        final Camera.Parameters parameters = camera.getParameters();
        List<String> supportedFocusModes = parameters.getSupportedFocusModes();
        LogUtils.infoMsg("supportedFocusModes " + supportedFocusModes);
        for (String mode : supportedFocusModes) {
            LogUtils.infoMsg("supportedFocusModes " + mode);
        }
    }
CameraManager cameraManager = (android.hardware.camera2.CameraManager) getSystemService(CAMERA_SERVICE);

int[] afModes = cameraManager.getCameraCharacteristics("0").get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);

if (afModes.length <= 1)
{Log.d(TAG, "Camera doesn't have autofocus");}
else
{Log.d(TAG, "Camera has autofocus");}

        Log.d(TAG, "CONTROL_AF_AVAILABLE_MODES:");
        for (int position : afModes) {
            switch (afModes[position]) {
                case 0:
                    Log.d(TAG, "CONTROL_AF_MODE_OFF (0)");
                    break;
                case 1:
                    Log.d(TAG, "CONTROL_AF_MODE_AUTO (1)");
                    break;
                case 2:
                    Log.d(TAG, "CONTROL_AF_MODE_MACRO (2)");
                    break;
                case 3:
                    Log.d(TAG, "CONTROL_AF_MODE_CONTINUOUS_VIDEO (3)");
                    break;
                case 4:
                    Log.d(TAG, "CONTROL_AF_MODE_CONTINUOUS_PICTURE (4)");
                    break;
                case 5:
                    Log.d(TAG, "CONTROL_AF_MODE_EDOF (5)");
                    break;
                default:
                    Log.d(TAG, String.valueOf(afModes[position]));
            }
        }

There are a number of methods of the Camera.Parameters class added in API Level 5 (I believe that maps to Android 2.0) that will return a list of supported features. Call getSupportedFocusModes on the Camera.Parameters object retrieved from camera.getParameters()

http://developer.android.com/reference/android/hardware/Camera.Parameters.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!