如何通过android的camera2中的代码进行聚焦?

时间:2018-03-20 11:09:12

标签: android focus android-camera2

我想在android中的相机应用程序中实现一个功能,我可以点击一个按钮而不是获得具有不同焦点的2张照片(不是手动对焦功能)。

我已完成所有操作,但我的焦点更改部分无法运行,我找不到原因,并尝试分析:

尝试1:我使用thisthis中的焦点控制代码来更改焦点,但它不起作用。

  1. cammera构建器设置部分:

    private CaptureRequest.Builder initDngBuilder() {
        CaptureRequest.Builder captureBuilder = null;
        try {
            captureBuilder = mCameraSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    
            captureBuilder.addTarget(mImageReader.getSurface());
            captureBuilder.addTarget(surface);
            // Required for RAW capture
            captureBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
            captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
            captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
            captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0.1f);
            captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2));
            captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
            captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2);
            captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90);
            CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
            String cameraid = CameraCharacteristics.LENS_FACING_FRONT + "";
            CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraid);
            Range<Integer> fps[] = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
            captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fps[fps.length - 1]);
        } catch (CameraAccessException e) {
            Toast.makeText(getActivity(), "reject", Toast.LENGTH_SHORT).show();
        } catch (NullPointerException e) {
            Toast.makeText(getActivity(), "fail", Toast.LENGTH_SHORT).show();
        }
        return captureBuilder;}
    private CaptureRequest.Builder initDngBuilder2() {
    CaptureRequest.Builder captureBuilder = null;
    try {
        captureBuilder = mCameraSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureBuilder.addTarget(mImageReader.getSurface());
        captureBuilder.addTarget(surface);
        // Required for RAW capture
        captureBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
        captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
        captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
        captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 100.0f);
        captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2));
        captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
        captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2);
        captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90);
        CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        String cameraid = CameraCharacteristics.LENS_FACING_FRONT + "";
        CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraid);
        Range<Integer> fps[] = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
        captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fps[fps.length - 1]);
    } catch (CameraAccessException e) {
        Toast.makeText(getActivity(), "reject", Toast.LENGTH_SHORT).show();
    } catch (NullPointerException e) {
        Toast.makeText(getActivity(), "fail", Toast.LENGTH_SHORT).show();
    }
    return captureBuilder;
    

    }

  2. 点击侦听器部分:

    private View.OnClickListener picOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        try {
            mCameraSession.capture(initDngBuilder().build(), null, mHandler);
            mCameraSession.capture(initDngBuilder2().build(), null, mHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }};
    
  3. 尝试2:我想知道我的Android设备是否没有这种能力(我认为这一点是因为:https://stackoverflow.com/a/42912408/9521891),所以我使用:

    int[] ints = mCameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
    
    for (int i = 0; i < ints.length; i++){
        Log.d(TAG, ints[i] + ",");
    }
    

    我只得到:“0,”。 这是否意味着设备没有“MANUAL_SENSOR”的能力?

1 个答案:

答案 0 :(得分:0)

是的,如果REQUEST_AVAILABLE_CAPABILITIES的内容仅包含BACKWARD_COMPATIBLE(0),则设备不支持MANUAL_SENSOR。

因此,不支持将LENS_FOCUS_DISTANCE设置为除0.0f(无穷远焦点)以外的任何值。