应用程序权限
当今设备和操作系统的许多功能如果被滥用,会对隐私、安全和性能产生重大影响。因此,越来越多的平台在访问这些功能前要求用户明确同意。
Qt 权限 API 允许应用程序以跨平台方式检查或请求此类功能的权限。
使用方法
通常需要用户同意的一项功能是访问设备的麦克风。一个录制语音备忘录的应用程序最初可能是这样的:
void VoiceMemoWidget::onRecordingInitiated() { m_microphone->startRecording(); }
为确保该应用程序在需要用户同意才能访问麦克风的平台上运行良好,我们将对其进行如下扩展:
voidVoiceMemoWidget::onRecordingInitiated() { QMicrophonePermissionmicrophonePermission;switch(qApp->checkPermission(microphonePermission)) {caseQt::PermissionStatus::Undetermined: qApp->requestPermission(microphonePermission, this, &VoiceMemoWidget::onRecordingInitiated);return;caseQt::PermissionStatus::Denied: m_permissionInstructionsDialog->show();return;caseQt::PermissionStatus::Granted: m_microphone->startRecording(); } }
我们首先检查是否已经知道麦克风权限的状态。如果不知道,我们会启动权限请求以确定当前状态,这可能会要求用户同意。我们会将请求结果连接到已进入的插槽,这样我们就有机会再次评估权限状态。
一旦知道了权限状态,无论是因为我们在早些时候获得了权限还是被拒绝了权限,还是在从我们刚刚发起的请求中得到结果后,我们都会将用户重定向到一个对话框,解释为什么我们此时不能录制语音备忘录(如果被拒绝了权限),或者继续使用麦克风(如果获得了权限)。
注意: 在 macOS 和 iOS 上,目前只能为图形用户界面应用程序请求权限。
声明权限
某些平台要求在构建时预先声明所请求的权限。
苹果平台
您申请的每个权限都必须在应用程序的 Info.plist
文件中的使用描述字符串,说明应用程序需要访问给定权限的原因。例如
<key>NSMicrophoneUsageDescription</key> <string>The microphone is used to record voice memos.</string>
每种权限类型的文档中都描述了相关的使用说明字符串。
为确保您的应用程序包含相关权限后端,请将构建系统指向您的自定义Info.plist
。
安卓
您申请的每个权限都必须在应用程序的AndroidManifest.xml
文件中包含一个uses-permission
条目。例如
<manifest ...> <uses-permission android:name="android.permission.RECORD_AUDIO"/> </manifest>
为确保您的应用程序包含相关权限后端,请将构建系统指向您的自定义AndroidManifest.xml
或使用 qt_add_android_permission()。
相关权限名称在每种权限类型的文档中都有描述。
可用权限
可用的权限类型如下:
访问蓝牙外设 | |
访问用户日历 | |
访问照相机以拍摄照片或视频 | |
访问用户的联系人 | |
访问用户的位置 | |
访问麦克风,用于监听或录制声音 |
最佳实践
为确保终端用户获得最佳用户体验,我们建议采用以下最佳实践来管理应用程序权限:
- 申请所需的最小权限。例如,如果只需要访问麦克风,就不要申请摄像头权限以防万一。使用单个权限类型的属性来进一步限制权限范围,例如QContactsPermission::setAccessMode() 来请求只读访问权限。
- 根据用户的特定操作请求权限。例如,推迟请求麦克风权限,直到用户按下按钮录制音频。将权限请求与特定操作联系起来,可以让用户更清楚地知道为什么需要权限。不要在启动时请求所有需要的权限。
- 如果需要,可提供额外的上下文和解释。有时,用户的操作并不能提供足够的上下文。可以考虑在用户启动操作后、请求权限前显示一个解释对话框,这样当系统权限对话框弹出时,用户就会知道将要发生什么。
- 透明、明确地说明需要权限的原因。在解释对话框和使用说明中,明确说明应用程序提供特定功能需要特定权限的原因,以便用户做出明智的决定。
- 说明被拒绝的权限。由于各种原因,您申请的权限可能会被拒绝。您应始终考虑到这种情况,优雅地降低应用程序的体验,并向用户清楚地解释这种情况。
- 切勿从库中请求权限。权限请求应尽可能贴近用户,因为用户可以获得所需的信息,以便就上述各点做出正确决定。图书馆可以检查权限,以确保它们具备开展工作的先决条件,但如果权限未确定或被拒绝,则应通过图书馆的 API 反映出来,以便应用程序反过来请求必要的权限。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.