summaryrefslogtreecommitdiffstats
path: root/src/plugins/android/src/wrappers/jni/androidcamera.cpp
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-03-27 13:46:33 +0100
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2019-05-13 09:38:48 +0000
commitb76fcb32d1cc1d87f1943900c2823c02ee85dbb6 (patch)
tree710eed52051b735bb453f1763ebbe922de00c3bf /src/plugins/android/src/wrappers/jni/androidcamera.cpp
parent02f1420dadfc9b68a31181d60d6dfd6e622ce3e8 (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>
Diffstat (limited to 'src/plugins/android/src/wrappers/jni/androidcamera.cpp')
-rw-r--r--src/plugins/android/src/wrappers/jni/androidcamera.cpp12
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()