summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-01-30 15:45:22 +0100
committerIvan Solovev <ivan.solovev@qt.io>2023-02-08 10:17:31 +0100
commitbea75b36c62ed730c46603326ab4e08bfedd9e36 (patch)
tree058102906d55b632779312f91eba6b08d8f1be5a /src/plugins
parente98bce0c5ff5afa609fdd8cde65a0405a77a4fa8 (diff)
Use new permissions API on Android
[ChangeLog][Important Behavior Changes][Android] The platform implementation no longer requests Camera and Microphone permissions, only checks if they are granted or not. The client application must request the permissions using the QPermission API. Note: The WRITE_EXTERNAL_STORAGE permission is not handled by this patch, because it's not supported by the new QPermission API for now. This permission is still requested from the library code. Task-number: QTBUG-109965 Change-Id: Ia51d324db3893940fe1ef18ced197cfd7b724a99 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/multimedia/android/common/qandroidmultimediautils.cpp41
-rw-r--r--src/plugins/multimedia/android/common/qandroidmultimediautils_p.h2
-rw-r--r--src/plugins/multimedia/android/mediacapture/qandroidcapturesession.cpp4
-rw-r--r--src/plugins/multimedia/android/wrappers/jni/androidcamera.cpp4
-rw-r--r--src/plugins/multimedia/ffmpeg/qandroidcamera.cpp19
5 files changed, 25 insertions, 45 deletions
diff --git a/src/plugins/multimedia/android/common/qandroidmultimediautils.cpp b/src/plugins/multimedia/android/common/qandroidmultimediautils.cpp
index afb5f82e9..6e4b95fe9 100644
--- a/src/plugins/multimedia/android/common/qandroidmultimediautils.cpp
+++ b/src/plugins/multimedia/android/common/qandroidmultimediautils.cpp
@@ -6,6 +6,7 @@
#include <qlist.h>
#include <QtCore/qcoreapplication.h>
+#include <QtCore/qpermissions.h>
#include <QtCore/private/qandroidextras_p.h>
QT_BEGIN_NAMESPACE
@@ -88,43 +89,27 @@ static bool androidRequestPermission(const QString &permission)
return true;
}
-static bool androidCheckPermission(const QString &permission)
+static bool androidCheckPermission(const QPermission &permission)
{
- if (QNativeInterface::QAndroidApplication::sdkVersion() < 23)
- return true;
-
- // Permission already granted?
- return (QtAndroidPrivate::checkPermission(permission).result() == QtAndroidPrivate::Authorized);
+ return qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
}
bool qt_androidCheckCameraPermission()
{
- return androidCheckPermission(QStringLiteral("android.permission.CAMERA"));
+ const QCameraPermission permission;
+ const auto granted = androidCheckPermission(permission);
+ if (!granted)
+ qCDebug(qtAndroidMediaPlugin, "Camera permission not granted!");
+ return granted;
}
bool qt_androidCheckMicrophonePermission()
{
- return androidCheckPermission(QStringLiteral("android.permission.RECORD_AUDIO"));
-}
-
-bool qt_androidRequestCameraPermission()
-{
- if (!androidRequestPermission(QStringLiteral("android.permission.CAMERA"))) {
- qCDebug(qtAndroidMediaPlugin, "Camera permission denied by user!");
- return false;
- }
-
- return true;
-}
-
-bool qt_androidRequestRecordingPermission()
-{
- if (!androidRequestPermission(QStringLiteral("android.permission.RECORD_AUDIO"))) {
- qCDebug(qtAndroidMediaPlugin, "Microphone permission denied by user!");
- return false;
- }
-
- return true;
+ const QMicrophonePermission permission;
+ const auto granted = androidCheckPermission(permission);
+ if (!granted)
+ qCDebug(qtAndroidMediaPlugin, "Microphone permission not granted!");
+ return granted;
}
bool qt_androidRequestWriteStoragePermission()
diff --git a/src/plugins/multimedia/android/common/qandroidmultimediautils_p.h b/src/plugins/multimedia/android/common/qandroidmultimediautils_p.h
index 1b9aab8f5..5fe841e8c 100644
--- a/src/plugins/multimedia/android/common/qandroidmultimediautils_p.h
+++ b/src/plugins/multimedia/android/common/qandroidmultimediautils_p.h
@@ -30,8 +30,6 @@ bool qt_sizeLessThan(const QSize &s1, const QSize &s2);
QVideoFrameFormat::PixelFormat qt_pixelFormatFromAndroidImageFormat(AndroidCamera::ImageFormat f);
AndroidCamera::ImageFormat qt_androidImageFormatFromPixelFormat(QVideoFrameFormat::PixelFormat f);
-bool qt_androidRequestCameraPermission();
-bool qt_androidRequestRecordingPermission();
bool qt_androidRequestWriteStoragePermission();
bool qt_androidCheckCameraPermission();
diff --git a/src/plugins/multimedia/android/mediacapture/qandroidcapturesession.cpp b/src/plugins/multimedia/android/mediacapture/qandroidcapturesession.cpp
index afee45e2f..5819741e0 100644
--- a/src/plugins/multimedia/android/mediacapture/qandroidcapturesession.cpp
+++ b/src/plugins/multimedia/android/mediacapture/qandroidcapturesession.cpp
@@ -116,13 +116,13 @@ void QAndroidCaptureSession::start(QMediaEncoderSettings &settings, const QUrl &
const bool validCameraSession = m_cameraSession && m_cameraSession->camera();
- if (validCameraSession && !qt_androidRequestCameraPermission()) {
+ if (validCameraSession && !qt_androidCheckCameraPermission()) {
emit error(QMediaRecorder::ResourceError, QLatin1String("Camera permission denied."));
setKeepAlive(false);
return;
}
- if (m_audioInput && !qt_androidRequestRecordingPermission()) {
+ if (m_audioInput && !qt_androidCheckMicrophonePermission()) {
emit error(QMediaRecorder::ResourceError, QLatin1String("Microphone permission denied."));
setKeepAlive(false);
return;
diff --git a/src/plugins/multimedia/android/wrappers/jni/androidcamera.cpp b/src/plugins/multimedia/android/wrappers/jni/androidcamera.cpp
index f8845cfa1..df2b5c407 100644
--- a/src/plugins/multimedia/android/wrappers/jni/androidcamera.cpp
+++ b/src/plugins/multimedia/android/wrappers/jni/androidcamera.cpp
@@ -316,7 +316,7 @@ AndroidCamera::~AndroidCamera()
AndroidCamera *AndroidCamera::open(int cameraId)
{
- if (!qt_androidRequestCameraPermission())
+ if (!qt_androidCheckCameraPermission())
return nullptr;
AndroidCameraPrivate *d = new AndroidCameraPrivate();
@@ -765,7 +765,7 @@ QJniObject AndroidCamera::getCameraObject()
int AndroidCamera::getNumberOfCameras()
{
- if (!qt_androidRequestCameraPermission())
+ if (!qt_androidCheckCameraPermission())
return 0;
return QJniObject::callStaticMethod<jint>("android/hardware/Camera",
diff --git a/src/plugins/multimedia/ffmpeg/qandroidcamera.cpp b/src/plugins/multimedia/ffmpeg/qandroidcamera.cpp
index e66c685f4..eee50dbfe 100644
--- a/src/plugins/multimedia/ffmpeg/qandroidcamera.cpp
+++ b/src/plugins/multimedia/ffmpeg/qandroidcamera.cpp
@@ -11,6 +11,7 @@
#include <qloggingcategory.h>
#include <private/qabstractvideobuffer_p.h>
#include <QtCore/qcoreapplication.h>
+#include <QtCore/qpermissions.h>
#include <QtCore/private/qandroidextras_p.h>
#include <private/qmemoryvideobuffer_p.h>
#include <private/qcameradevice_p.h>
@@ -115,19 +116,15 @@ QCameraFormat getDefaultCameraFormat()
return defaultFormat->create();
}
-bool checkAndRequestCameraPermission()
+bool checkCameraPermission()
{
- const auto key = QStringLiteral("android.permission.CAMERA");
+ QCameraPermission permission;
- if (QtAndroidPrivate::checkPermission(key).result() == QtAndroidPrivate::Authorized)
- return true;
+ const bool granted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
+ if (!granted)
+ qCWarning(qLCAndroidCamera) << "Access to camera not granted!";
- if (QtAndroidPrivate::requestPermission(key).result() != QtAndroidPrivate::Authorized) {
- qCWarning(qLCAndroidCamera) << "User has denied access to camera";
- return false;
- }
-
- return true;
+ return granted;
}
} // namespace
@@ -243,7 +240,7 @@ void QAndroidCamera::setActive(bool active)
return;
}
- if (active && checkAndRequestCameraPermission()) {
+ if (active && checkCameraPermission()) {
QWriteLocker locker(rwLock);
int width = m_cameraFormat.resolution().width();
int height = m_cameraFormat.resolution().height();