QML应用程序权限
今天设备的许多功能和操作系统如果被滥用,可能会对隐私、安全和性能产生重大影响。因此,平台在访问这些功能之前要求用户明确同意变得越来越普遍。
Qt QML核心模块通过一组权限类型将Qt C++的应用程序权限功能暴露给QML,用这些类型可以在跨平台上检查或请求权限。
访问用户的蓝牙外围设备 | |
访问用户日历 | |
访问用户相机 | |
访问用户联系人 | |
访问用户位置 | |
访问用户麦克风 |
用法
要检查和请求应用程序中的特定权限,包括相应权限类型的实例,如果需要,设置任何属性
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. 的商标。所有其他商标均为其各自所有者的财产。