diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-01-30 15:45:22 +0100 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2023-02-08 10:17:31 +0100 |
commit | bea75b36c62ed730c46603326ab4e08bfedd9e36 (patch) | |
tree | 058102906d55b632779312f91eba6b08d8f1be5a /src/plugins | |
parent | e98bce0c5ff5afa609fdd8cde65a0405a77a4fa8 (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')
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(); |