diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-03-27 13:46:33 +0100 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-05-13 09:38:48 +0000 |
commit | b76fcb32d1cc1d87f1943900c2823c02ee85dbb6 (patch) | |
tree | 710eed52051b735bb453f1763ebbe922de00c3bf | |
parent | 02f1420dadfc9b68a31181d60d6dfd6e622ce3e8 (diff) |
Android: Don't open camera if it was already opened
The application should only have one Camera object active
at a time for a particular hardware camera.
Since there is no way to determine that the camera has been already opened by
the same application, added a fix to prevent opening the camera if it
was already opened and not released.
Task-number: QTBUG-73582
Change-Id: Ide9ddea0c32489d86a613846ecf2e91ef94a776c
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
-rw-r--r-- | src/plugins/android/src/wrappers/jni/androidcamera.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index e3afddd59..90af0119a 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -832,10 +832,17 @@ AndroidCameraPrivate::~AndroidCameraPrivate() { } +static qint32 s_activeCameras = 0; + bool AndroidCameraPrivate::init(int cameraId) { m_cameraId = cameraId; QJNIEnvironmentPrivate env; + + const bool opened = s_activeCameras & (1 << cameraId); + if (opened) + return false; + m_camera = QJNIObjectPrivate::callStaticObjectMethod("android/hardware/Camera", "open", "(I)Landroid/hardware/Camera;", @@ -854,6 +861,7 @@ bool AndroidCameraPrivate::init(int cameraId) QJNIObjectPrivate params = m_camera.callObjectMethod("getParameters", "()Landroid/hardware/Camera$Parameters;"); m_parameters = QJNIObjectPrivate(params); + s_activeCameras |= 1 << cameraId; return true; } @@ -864,8 +872,10 @@ void AndroidCameraPrivate::release() m_parametersMutex.lock(); m_parameters = QJNIObjectPrivate(); m_parametersMutex.unlock(); - if (m_camera.isValid()) + if (m_camera.isValid()) { m_camera.callMethod<void>("release"); + s_activeCameras &= ~(1 << m_cameraId); + } } bool AndroidCameraPrivate::lock() |