QML应用程序权限

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

Qt QML核心模块通过一组权限类型将Qt C++的应用程序权限功能暴露给QML,用这些类型可以在跨平台上检查或请求权限。

BluetoothPermission

访问用户的蓝牙外围设备

CalendarPermission

访问用户日历

CameraPermission

访问用户相机

ContactsPermission

访问用户联系人

LocationPermission

访问用户位置

MicrophonePermission

访问用户麦克风

用法

要检查和请求应用程序中的特定权限,包括相应权限类型的实例,如果需要,设置任何属性

CalendarPermission {
    id: calendarPermission
    accessMode: CalendarPermission.ReadWrite
}

该类型可用于检查权限的当前状态,例如,以基于状态的UI

states: [
    State {
        name: "waitingForPermission"
        when: calendarPermission.status == Qt.PermissionStatus.Undetermined
        PropertyChanges { target: permissionRequestItem; visible: true }
    },
    State {
        name: "permissionDenied"
        when: calendarPermission.status == Qt.PermissionStatus.Denied
        PropertyChanges { target: permissionDeniedItem; visible: true }
    }
]

在上面的例子中,如果权限状态未获批准,将叠加两个特定的权限项目。请求UI可能看起来像

Rectangle {
    id: permissionRequestItem
    anchors.fill: parent
    visible: false

    Text {
        anchors.centerIn: parent
        text: qsTr("We need your permission to access the calendar."
            + "Please tap this screen to request permission.")

    }

    MouseArea {
        anchors.fill: parent
        onClicked: calendarPermission.request()
    }
}

相应的拒绝UI

Rectangle {
    id: permissionDeniedItem
    anchors.fill: parent
    color: "red"
    visible: false
    Text {
        anchors.centerIn: parent
        text: qsTr("We need your permission to access the calendar,"
            + "but permission was not granted. Please resolve.")
    }
}

更改权限属性

权限的属性可以在发起请求后通过调用`request()`来更改。这将根据新属性值的更改更新状态,但不会自动使用新的属性集进行请求。

例如,如果将已批准的以访问模式Qt.CalendarPermission.ReadOnly的日历权限升级到Qt.CalendarPermission.ReadWrite,平台将以以下三种方式之一响应

  • 隐式批准扩展权限,例如,因为平台不区分两种访问模式,这将导致无状态变化。
  • 将状态移回不确定,以便用户可以再次咨询访问现在扩展的权限。
  • 将状态移至拒绝,例如,如果一旦初次请求就无法升级权限。

所有这些状态都应该将应用程序的UI移动到适当的状态,在这种情况下,用户会了解新的状态,如果有可能,可以请求新的权限,或者退回到较少扩展的权限。

权限项目之间的交互

尽管权限状态最终与底层应用程序相关,但每个权限项都独立于所有其他项目报告其自身状态,并在需要时需要独立请求。

例如,请求访问单个项目的日历将不会更新另一个 CalendarPermission 项目的状态,即使这些具有完全相同的属性。

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献是其各自所有者的版权。所提供的文档根据 Free Software Foundation 发布的 GNU自由文档许可证版本1.3 的条款许可。Qt 和相关标志是芬兰及/或全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。