本页内容

应用程序权限

当今设备和操作系统的许多功能,若被滥用,可能会对隐私、安全性和性能产生重大影响。因此,平台在访问这些功能之前要求用户明确同意的做法正变得越来越普遍。

Qt 权限 API 允许应用程序以跨平台的方式检查或请求此类功能的权限。

用法

通常需要用户同意的一项功能是访问设备的麦克风。一款用于录制语音备忘录的应用程序,其初始代码可能如下所示:

void VoiceMemoWidget::onRecordingInitiated()
{
    m_microphone->startRecording();
}

为了确保该应用在需要用户同意才能访问麦克风的平台上正常运行,我们可以对其进行如下扩展:

voidVoiceMemoWidget::onRecordingInitiated()
{
    QMicrophonePermission microphonePermission;
    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上 ,目前仅可为 GUI 应用程序请求权限。

声明权限

某些平台要求在构建时就预先声明所请求的权限。

Apple 平台

您请求的每项权限都必须在应用程序的 Info.plist 文件中附带一个所谓的“使用说明字符串”,说明应用程序为何需要访问该权限。例如:

<key>NSMicrophoneUsageDescription</key>
<string>The microphone is used to record voice memos.</string>

相关用途描述键在各权限类型的文档中均有说明。

为确保应用程序中包含相应的权限后端,请将构建系统指向您的自定义Info.plist 。

Android

您请求的每项权限都必须在应用的AndroidManifest.xml 文件中配有相应的uses-permission 条目。例如:

<manifest ...>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>

为确保应用程序中包含相应的权限后端,请将构建系统指向您的自定义AndroidManifest.xml文件,或使用qt_add_android_permission() 函数。

相关权限名称在各权限类型的文档中均有说明。

注意: 使用此 API时, AndroidManifest.xml 文件中必须包含<!-- %%INSERT_PERMISSIONS --> 标签。有关此标签使用的更多信息,请参阅《Qt 权限与功能》

可用权限

提供以下权限类型:

QBluetoothPermission

访问蓝牙外设

QCalendarPermission

访问用户的日历

QCameraPermission

访问相机以拍摄照片或视频

QContactsPermission

访问用户的联系人

QLocationPermission

访问用户的位置

QMicrophonePermission

访问麦克风以监听或录制声音

注意: 可用的权限类型 涵盖了Qt Multimedia 和Qt Positioning 等Qt模块的核心功能,但并不包括所有平台特有的权限。目前不支持自定义权限类型。

最佳实践

为了确保为最终用户提供最佳的用户体验,我们建议在管理应用程序权限时遵循以下最佳实践:

  • 仅请求所需的最低权限。例如,如果您只需要访问麦克风,请不要为了以防万一而请求摄像头权限。利用各个权限类型的属性进一步限制权限范围,例如使用QContactsPermission::setAccessMode()来请求只读访问权限。
  • 根据用户的具体操作来请求权限。例如,将麦克风权限的请求推迟到用户按下录音按钮时再进行。将权限请求与特定操作关联,能让用户更清楚地了解为何需要该权限。切勿在应用启动时就请求所有所需的权限。
  • 如有必要,请提供额外的上下文和说明。有时仅靠用户的操作无法提供充分的上下文信息。请考虑在用户发起操作后、但请求权限之前显示一个说明对话框,以便当系统权限对话框随后弹出时,用户清楚了解即将发生的情况。
  • 关于为何需要权限,请保持透明和明确。在解释对话框和使用说明中,请明确说明应用程序为何需要特定权限才能提供某项功能,以便用户做出明智的决定。
  • 应对权限被拒绝的情况。您请求的权限可能会因各种原因被拒绝。您应始终考虑到这种情况,通过优雅地降级应用程序体验,并向用户清晰说明当前状况来妥善处理。
  • 切勿通过库请求权限。权限请求应尽可能贴近用户进行,因为只有在用户端,才具备上述决策所需的完整信息。 库可以检查权限,以确保其具备执行操作的先决条件,但如果权限状态未确定或被拒绝,应通过库的 API 反映这一情况,以便应用程序进而请求必要的权限。

另请参阅 《信息属性列表文件》和《Qt Creator :编辑清单文件》。

© 2026 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.