summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Moskal <bartlomiej.moskal@qt.io>2023-08-07 19:16:15 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-08-09 15:47:18 +0000
commitf41df38df5d14f8afbdd4f6226ab7268cb4d009a (patch)
tree42964e1eefc54640d695b59f262ebeb0ca605c0d
parent6d36afb3117208acc37f011b304f03392eae8535 (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.java20
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/multimedia/QtVideoDeviceManager.java9
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);