Many features of today's devices and operating systems can have significant privacy, security, and performance implications if misused. It's therefore increasingly common for platforms to require explicit consent from the user before accessing these features.
The Qt permission APIs allow the application to check or request permission for such features in a cross platform manner.
A feature that commonly requires user consent is access to the microphone of the device. An application for recording voice memos would perhaps look something like this initially:
void VoiceMemoWidget::onRecordingInitiated() { m_microphone->startRecording(); }
To ensure this application works well on platforms that require user consent for microphone access we would extend it like this:
void VoiceMemoWidget::onRecordingInitiated() { #if QT_CONFIG(permissions) QMicrophonePermission microphonePermission; switch (qApp->checkPermission(microphonePermission)) { case Qt::PermissionStatus::Undetermined: qApp->requestPermission(microphonePermission, this, &VoiceMemoWidget::onRecordingInitiated); return; case Qt::PermissionStatus::Denied: m_permissionInstructionsDialog->show(); return; case Qt::PermissionStatus::Granted: break; // Proceed } #endif m_microphone->startRecording(); }
We first check if we already know the status of the microphone permission. If we don't we initiate a permission request to determine the current status, which will potentially ask the user for consent. We connect the result of the request to the slot we're already in, so that we get another chance at evaluating the permission status.
Once the permission status is known, either because we had been granted or denied permission at an earlier time, or after getting the result back from the request we just initiated, we redirect the user to a dialog explaining why we can not record voice memos at this time (if the permission was denied), or proceed to using the microphone (if permission was granted).
The use of the
QT_CONFIG(permissions)
macro ensures that the code will work as before on platforms where permissions are not available.
注意: On macOS and iOS permissions can currently only be requested for GUI applications.
Some platforms require that the permissions you request are declared up front at build time.
Each permission you request must be accompanied by a so called
usage description
string in the application's
Info.plist
file, describing why the application needs to access the given permission. For example:
<key>NSMicrophoneUsageDescription</key> <string>The microphone is used to record voice memos.</string>
The relevant usage description keys are described in the documentation for each permission type.
Each permission you request must be accompanied by a
uses-permission
entry in the application's
AndroidManifest.xml
文件。例如:
<manifest ...> <uses-permission android:name="android.permission.RECORD_AUDIO"/> </manifest>
The relevant permission names are described in the documentation for each permission type.
下列权限类型可用:
QBluetoothPermission | 访问蓝牙外围设备 |
QCalendarPermission | 访问用户的日历 |
QCameraPermission | 访问摄像头为取得图片 (或视频) |
QContactsPermission | 访问用户的联系人 |
QLocationPermission | 访问用户的位置 |
QMicrophonePermission | 为监视访问麦克风 (或录制声音) |
To ensure the best possible user experience for the end user we recommend adopting the following best practices for managing application permissions:
另请参阅 信息特性列表文件 and Qt Creator:编辑清单文件 .