diff options
author | Christian Strømme <christian.stromme@qt.io> | 2016-12-13 17:26:18 +0100 |
---|---|---|
committer | Christian Stromme <christian.stromme@qt.io> | 2017-03-30 14:20:33 +0000 |
commit | d5d7dcfb15c0b5c5e9009b83fba922ea0b7e86f5 (patch) | |
tree | 9969ad4128255b4c8addf0655dbda3d7ffaf674b /src | |
parent | 954a85a1b3fb704a2b8590467e010300faee6798 (diff) |
OpenSL ES: Added run-time permission checks for recording on Android5.8
Make sure that we have permission to record before starting a recording
session.
[ChangeLog][OpenSL ES][Android] Added run-time permission checks for
recording on Android.
Task-number: QTBUG-55992
Change-Id: Iab7416384336975fdf4de8024f02ab2414033163
Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/opensles/qopenslesaudioinput.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/plugins/opensles/qopenslesaudioinput.cpp b/src/plugins/opensles/qopenslesaudioinput.cpp index 30860650b..c3f5ed422 100644 --- a/src/plugins/opensles/qopenslesaudioinput.cpp +++ b/src/plugins/opensles/qopenslesaudioinput.cpp @@ -46,6 +46,8 @@ #ifdef ANDROID #include <SLES/OpenSLES_AndroidConfiguration.h> +#include <QtCore/private/qjnihelpers_p.h> +#include <QtCore/private/qjni_p.h> #endif QT_BEGIN_NAMESPACE @@ -55,6 +57,32 @@ QT_BEGIN_NAMESPACE #define MINIMUM_PERIOD_TIME_MS 5 #ifdef ANDROID +static bool hasRecordingPermission() +{ + using namespace QtAndroidPrivate; + if (androidSdkVersion() < 23) + return true; + + const QString key(QLatin1String("android.permission.RECORD_AUDIO")); + PermissionsResult res = checkPermission(key); + if (res == PermissionsResult::Granted) // Permission already granted? + return true; + + QJNIEnvironmentPrivate env; + const auto &results = requestPermissionsSync(env, QStringList() << key); + if (!results.contains(key)) { + qWarning("No permission found for key: %s", qPrintable(key)); + return false; + } + + if (results[key] == PermissionsResult::Denied) { + qDebug("%s - Permission denied by user!", qPrintable(key)); + return false; + } + + return true; +} + static void bufferQueueCallback(SLAndroidSimpleBufferQueueItf, void *context) #else static void bufferQueueCallback(SLBufferQueueItf, void *context) @@ -179,6 +207,9 @@ QIODevice *QOpenSLESAudioInput::start() bool QOpenSLESAudioInput::startRecording() { + if (!hasRecordingPermission()) + return false; + m_processedBytes = 0; m_clockStamp.restart(); m_lastNotifyTime = 0; |