I want to implement a function in a camera app in android that I can click a button than get 2 photo with different focus(not a manual focus function).
I've complete all except that my focus change part can't run, I can't find the cause, and try to analysis:
Try 1: I use the focus control code in this and this to change the focus, but it didn't work.
The cammera builder set part:
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;
}
The click listener part:
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(); } }};
Try 2: I want to figure out if my android device don't have the ability(I consider that point because: https://stackoverflow.com/a/42912408/9521891), so I use:
int[] ints = mCameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
for (int i = 0; i < ints.length; i++){
Log.d(TAG, ints[i] + ",");
}
And I got only :" 0, ". Does it means the device don't have the ablility 'MANUAL_SENSOR'?