diff options
author | Bartlomiej Moskal <bartlomiej.moskal@qt.io> | 2023-08-07 19:16:15 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-08-09 15:47:18 +0000 |
commit | f41df38df5d14f8afbdd4f6226ab7268cb4d009a (patch) | |
tree | 42964e1eefc54640d695b59f262ebeb0ca605c0d | |
parent | 6d36afb3117208acc37f011b304f03392eae8535 (diff) |
Android: Fix taking photos for unavailable CONTINUOUS_PICTURE mode
It seems that auto-focus mode cannot be set to CONTINUOUS_PICTURE on
some devices. In such case, when trying to set AF_TRIGGER_START, Auto
Focus state will never change from INACTIVE[0]
If CONTROL_AF_MODE cannot be set to CONTINUOUS_PICTURE, just take a
photo without triggering auto-focus.
[0]https://developer.android.com/reference/android/hardware/camera2/CaptureResult#CONTROL_AE_STATE
Fixes: QTBUG-115842
Change-Id: I783e34c0971934904e7f19654cd5505ffc221f68
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
(cherry picked from commit 79cc5daf960a8ed293ec21da1744d5041af5230f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/android/jar/src/org/qtproject/qt/android/multimedia/QtCamera2.java | 20 | ||||
-rw-r--r-- | src/android/jar/src/org/qtproject/qt/android/multimedia/QtVideoDeviceManager.java | 9 |
2 files changed, 25 insertions, 4 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCamera2.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCamera2.java index 4076f42dd..5c46e486c 100644 --- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCamera2.java +++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCamera2.java @@ -58,6 +58,7 @@ public class QtCamera2 { private static int MaxNumberFrames = 10; private int mFlashMode = CaptureRequest.CONTROL_AE_MODE_ON; private int mTorchMode = CameraMetadata.FLASH_MODE_OFF; + private int mAFMode = CaptureRequest.CONTROL_AF_MODE_OFF; native void onCameraOpened(String cameraId); native void onCameraDisconnect(String cameraId); @@ -290,11 +291,18 @@ public class QtCamera2 { try { mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(template); mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); + mAFMode = CaptureRequest.CONTROL_AF_MODE_OFF; + for (int mode : mVideoDeviceManager.getSupportedAfModes(mCameraId)) { + if (mode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE) { + mAFMode = mode; + break; + } + } mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, mFlashMode); mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, mTorchMode); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE); - mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, mAFMode); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CameraMetadata.CONTROL_CAPTURE_INTENT_VIDEO_RECORD); mPreviewRequest = mPreviewRequestBuilder.build(); @@ -366,9 +374,13 @@ public class QtCamera2 { public void takePhoto() { try { - mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); - mState = STATE_WAITING_LOCK; - mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); + if (mAFMode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE) { + mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); + mState = STATE_WAITING_LOCK; + mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); + } else { + capturePhoto(); + } } catch (CameraAccessException e) { Log.w("QtCamera2", "Cannot get access to the camera: " + e); } diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtVideoDeviceManager.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtVideoDeviceManager.java index 5b0e730ec..255d1e504 100644 --- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtVideoDeviceManager.java +++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtVideoDeviceManager.java @@ -155,6 +155,15 @@ public class QtVideoDeviceManager { } } + public int[] getSupportedAfModes(String cameraId) { + + CameraCharacteristics characteristics = getCameraCharacteristics(cameraId); + if (characteristics == null) + return new int[0]; + + return characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES); + } + public String[] getSupportedFlashModes(String cameraId) { CameraCharacteristics characteristics = getCameraCharacteristics(cameraId); |