summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-11-13 11:05:48 +0100
committerVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-11-15 12:27:24 +0100
commit72fdf4b20e916ea87b334be1a35235ac1023e0d8 (patch)
treedbda2c7df41e137edd9d30fc594ac6ec2842ca52
parent1d17e3973dda183545025e6d8f99dc3f219344e5 (diff)
downloadqtmultimedia-72fdf4b20e916ea87b334be1a35235ac1023e0d8.tar.gz
Android: Don't close camera when recording permission is asked
If camera permission is granted and recording is requested it also requires recording audio permission. If it was not granted before the popup will be shown to ask the user to grant the permission and the app goes to inactive state, which destroys the camera handlers. When the camera is loaded but the app requires additional permissions, it should not destroy the camera. Change-Id: Iee3662a7ac3381b0eb29190779b0116f9f64304f Fixes: QTBUG-79909 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--src/plugins/android/src/common/qandroidmultimediautils.cpp5
-rw-r--r--src/plugins/android/src/common/qandroidmultimediautils.h1
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp11
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.h2
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcapturesession.cpp6
-rw-r--r--src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp5
-rw-r--r--src/plugins/android/src/wrappers/jni/androidmediarecorder.h1
7 files changed, 22 insertions, 9 deletions
diff --git a/src/plugins/android/src/common/qandroidmultimediautils.cpp b/src/plugins/android/src/common/qandroidmultimediautils.cpp
index a4a7f773d..fa6e7da65 100644
--- a/src/plugins/android/src/common/qandroidmultimediautils.cpp
+++ b/src/plugins/android/src/common/qandroidmultimediautils.cpp
@@ -139,4 +139,9 @@ bool qt_androidRequestPermission(const QString &key)
return true;
}
+bool qt_androidRequestRecordingPermission()
+{
+ return qt_androidRequestPermission(QLatin1String("android.permission.RECORD_AUDIO"));
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/android/src/common/qandroidmultimediautils.h b/src/plugins/android/src/common/qandroidmultimediautils.h
index 0a837ae3c..bbd2e9aa5 100644
--- a/src/plugins/android/src/common/qandroidmultimediautils.h
+++ b/src/plugins/android/src/common/qandroidmultimediautils.h
@@ -56,6 +56,7 @@ QVideoFrame::PixelFormat qt_pixelFormatFromAndroidImageFormat(AndroidCamera::Ima
AndroidCamera::ImageFormat qt_androidImageFormatFromPixelFormat(QVideoFrame::PixelFormat f);
bool qt_androidRequestPermission(const QString &key);
+bool qt_androidRequestRecordingPermission();
QT_END_NAMESPACE
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index 6a30e5300..9de3330c7 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -78,6 +78,7 @@ QAndroidCameraSession::QAndroidCameraSession(QObject *parent)
, m_captureCanceled(false)
, m_currentImageCaptureId(-1)
, m_previewCallback(0)
+ , m_keepActive(false)
{
m_mediaStorageLocation.addStorageLocation(
QMediaStorageLocation::Pictures,
@@ -913,7 +914,7 @@ void QAndroidCameraSession::onApplicationStateChanged(Qt::ApplicationState state
{
switch (state) {
case Qt::ApplicationInactive:
- if (m_state != QCamera::UnloadedState) {
+ if (!m_keepActive && m_state != QCamera::UnloadedState) {
m_savedState = m_state;
close();
m_state = QCamera::UnloadedState;
@@ -931,4 +932,12 @@ void QAndroidCameraSession::onApplicationStateChanged(Qt::ApplicationState state
}
}
+bool QAndroidCameraSession::requestRecordingPermission()
+{
+ m_keepActive = true;
+ const bool result = qt_androidRequestRecordingPermission();
+ m_keepActive = false;
+ return result;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.h b/src/plugins/android/src/mediacapture/qandroidcamerasession.h
index b51dcc628..728dc484e 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.h
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.h
@@ -112,6 +112,7 @@ public:
virtual void onFrameAvailable(const QVideoFrame &frame) = 0;
};
void setPreviewCallback(PreviewCallback *callback);
+ bool requestRecordingPermission();
Q_SIGNALS:
void statusChanged(QCamera::Status status);
@@ -196,6 +197,7 @@ private:
QSet<QAndroidMediaVideoProbeControl *> m_videoProbes;
QMutex m_videoProbesMutex;
PreviewCallback *m_previewCallback;
+ bool m_keepActive;
};
QT_END_NAMESPACE
diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp
index bc9bc983e..7cc3ad619 100644
--- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp
@@ -206,8 +206,10 @@ void QAndroidCaptureSession::start()
delete m_mediaRecorder;
}
-
- if (!AndroidMediaRecorder::requestRecordingPermission()) {
+ const bool granted = m_cameraSession
+ ? m_cameraSession->requestRecordingPermission()
+ : qt_androidRequestRecordingPermission();
+ if (!granted) {
setStatus(QMediaRecorder::UnavailableStatus);
Q_EMIT error(QMediaRecorder::ResourceError, QLatin1String("Permission denied."));
return;
diff --git a/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp b/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp
index d0101411b..d607ab806 100644
--- a/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp
+++ b/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp
@@ -383,11 +383,6 @@ void AndroidMediaRecorder::setSurfaceHolder(AndroidSurfaceHolder *holder)
}
}
-bool AndroidMediaRecorder::requestRecordingPermission()
-{
- return qt_androidRequestPermission(QLatin1String("android.permission.RECORD_AUDIO"));
-}
-
bool AndroidMediaRecorder::initJNI(JNIEnv *env)
{
jclass clazz = QJNIEnvironmentPrivate::findClass(QtMediaRecorderListenerClassName,
diff --git a/src/plugins/android/src/wrappers/jni/androidmediarecorder.h b/src/plugins/android/src/wrappers/jni/androidmediarecorder.h
index cd2d164d8..e4b3a80ea 100644
--- a/src/plugins/android/src/wrappers/jni/androidmediarecorder.h
+++ b/src/plugins/android/src/wrappers/jni/androidmediarecorder.h
@@ -160,7 +160,6 @@ public:
void setSurfaceTexture(AndroidSurfaceTexture *texture);
void setSurfaceHolder(AndroidSurfaceHolder *holder);
- static bool requestRecordingPermission();
static bool initJNI(JNIEnv *env);
Q_SIGNALS: