【HarmonyOS NEXT】权限申请及应用设置页跳转

关键词:鸿蒙、程序访问控制、定位、应用详情页、startability、want

在app开发过程中,常进行系统权限的申请以提供设备访问或个性化功能(如扫一扫、城市定位、剪贴板等),从而保障应用功能的完整性,那么本期文章将以获取定位信息为例从①用户首次拒绝授权,②用户使用期间取消定位授权,③系统定位未开启 3 个方面介绍应用如何申请系统权限与引导用户授权,结尾附其他常用设置页跳转 URI 。

本期完整Demo已提交至Gitee:https://gitee.com/luvi/request-permission

目录

拉起授权弹窗

拒绝权限或途中取消授权 打开应用设置

系统功能未开启 打开系统设置

如何检查系统定位或app定位权限未开启

1. 系统定位未开启

2. app定位未允许

3. 示例代码

权限申请注意事项

Want 信息 uri 字段与设置页面对应表格


拉起授权弹窗

用户首次同意该权限,并且已开启系统定位,那么直接拉起系统权限的申请弹窗即可,需要注意的是使用 AtManager 授权权限的前提是需要在模块的 module.json5 中添加权限。

// 申请权限需导入Access模块
import { abilityAccessCtrl, PermissionRequestResult, Permissions } from '@kit.AbilityKit';/*** 获取定位*/
async _requestPermission(): Promise<boolean> {this.tipsType = TIPS_TYPE.NULLreturn new Promise((r, j) => {// 此处 permissionList 需要在项目的 module.json5 文件中添加权限与描述let permissionList: Permissions[] = ["ohos.permission.LOCATION", "ohos.permission.APPROXIMATELY_LOCATION"]let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();atManager.requestPermissionsFromUser(getContext(), permissionList,(err: BusinessError, data: PermissionRequestResult) => {if (err) {console.error(`luvi > requestPermissionsFromUser fail, err->${JSON.stringify(err)}`);r(false)} else {console.info('luvi > data:' + JSON.stringify(data));console.info('luvi > data permissions:' + data.permissions);console.info('luvi > data authResults:' + data.authResults);console.info('luvi > data dialogShownResults:' + data.dialogShownResults);// 授权成功data.authResults?.forEach((aItem) => {aItem == 0 && r(true)})}});})
}

拒绝权限或途中取消授权 打开应用设置

用户首次拒绝定位权限在应用使用期间用户自行取消了定位权限的授权行为,再次使用该权限对应的功能会引发报错问题导致应用程序功能无法正确执行,此时我们需要进行弹窗提示,引导用户前往应用设置页手动开启该权限,只要在功能使用时检查app授权状态即使用户途中取消授权也可进行弹窗提示。

跳转方案:配置 want 信息,使用 startAbility 进行跳转,此处需要设置应用包名信息,直接通过应用上下文 context 获取,不过这里需要断言类型为 UIAbilityContext ,不然没有 bundleName 的获取接口。

/*** 打开应用设置*/
_openAppSetting() {let context = getContext(this) as common.UIAbilityContext;let want: Want = {bundleName: 'com.huawei.hmos.settings', //设置应用bundleNameabilityName: 'com.huawei.hmos.settings.MainAbility', //设置应用abilityNameuri: "application_info_entry", //通知管理页面parameters: {pushParams: context.abilityInfo.bundleName}}context.startAbility(want)
}

系统功能未开启 打开系统设置

在使用应用该功能过程中,用户未开启系统定位,需引导用户前往系统定位页手动开启定位权限。

跳转方案:配置 want 信息,使用 startAbility 进行跳转。

/*** 打开系统设置*/
_openSysSetting() {let context = getContext(this) as common.UIAbilityContext;let want: Want = {bundleName: 'com.huawei.hmos.settings', //设置应用bundleNameabilityName: 'com.huawei.hmos.settings.MainAbility', //设置应用abilityNameuri: "location_manager_settings"}context.startAbility(want)
}

如何检查系统定位或app定位权限未开启

1. 系统定位未开启

获取位置信息需要使用 geoLocationManager 模块的 getCurrentLocation 方法,在使用该方法前用 try catch 捕获代码异常,若系统权限未开启,则会直接进入 catch 回调中并返回报错原因,若错误码返回 3301100 即代表app权限未开启(同理可利用该回调判断当前设备是否支持定位功能),那么我们可以在此时进行弹窗提示引导用户前往系统设置页面。

2. app定位未允许

若系统定位已开启,app定位权限未允许,在调用 getCurrentLocation 后会进入 Promise 的 .catch() 失败回调中(若使用 callback 形式,则 err 返回值不为空),若错误码返回 201 即代表app权限未开启,那么我们可以在此时进行弹窗提示引导用户前往app设置页面。

3. 示例代码

/*** 获取定位*/
_loadLocation() {let request: geoLocationManager.SingleLocationRequest ={ 'locatingTimeoutMs': 10000, 'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_ACCURACY };try {geoLocationManager.getCurrentLocation(request).then((result) => {console.log('luvi current location: ' + JSON.stringify(result));// 经纬度换城市名let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest ={ "latitude": result.latitude, "longitude": result.longitude, "maxItems": 1 };try {geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {if (err) {console.error('getAddressesFromLocation: err=' + JSON.stringify(err));}if (data) {let res =`latitude: ${result.latitude}, longitude: ${result.longitude}, cityName: ${data[0].placeName}`this.result = resconsole.log("luvi > res " + res)}});} catch (err) {console.error("luvi > errCode:" + JSON.stringify(err));}}).catch((err: BusinessError) => {// 应用定位权限未开启if (err.code == 201) {// 引导用户前往app设置页面}console.log("luvi > errCode:" + JSON.stringify(err));})} catch (err) {console.log("luvi > errCode:" + JSON.stringify(err));// 位置信息获取失败,没有开启系统定位,if (err.code == 3301100) {// 引导用户前往系统设置页面}}}

权限申请注意事项

并非所有权限都需要拉起弹窗授权,如网络权限只需在 module.json5 中配置即可,如定位、相机、日历则需要用户手动授权,此时需要关注官方文档的描述按规则开发即可。需要注意的是,在拉起系统弹窗授权前一步,APP中需明确告知接下来要授权的权限的作用和使用场景,需自行弹窗描述,当用户手动确认同意后才可进行系统权限的授权拉起操作,否则缺少这一步直接拉起系统授权,应用上架应用市场时可能会审核不通过。

Want 信息 uri 字段与设置页面对应表格

字段

拉起界面

手机设备是否支持

2in1设备是否支持

/(传/会拉起一个空白页面,如果拉起设置首页,传空字符串即可)

HOME-设置

wifi_entry

HOME-WLAN

bluetooth_entry

HOME-蓝牙

mobile_network_entry

HOME-移动网络

hotspot_data_settings

HOME-移动网络-个人热点界面

password_entry

HOME-移动网络-个人热点-密码界面

connected_device_entry

HOME-移动网络-个人热点-已连接设备界面

more_share_entry

HOME-移动网络-个人热点-更多共享设置界面

more_connections_settings

HOME-更多连接

nfc_settings

HOME-更多连接-NFC三级页面

display_settings

HOME-显示和亮度

screen_zoom

HOME-显示和亮度-显示大小三级页面

screen_refresh_rate_entry

HOME-显示和亮度-屏幕刷新率三级页面

需看具体设备是否有刷新率选项

volume_settings

HOME-声音和振动

systemui_notification_settings

HOME-通知和状态栏

accessibility_feature

HOME-辅助功能

accessibility_operation_entry

HOME-辅助功能-辅助功能快捷键三级页面

accessibility_more_settings_entry

HOME-辅助功能-已安装的服务-服务详情-更多设置五级页面

application_and_service_settings

HOME-应用与元服务

application_settings

HOME-应用与服务-应用管理三级页面

application_info_entry

HOME-应用和元服务HOME-某个具体应用的应用信息,需传递want.parameters.pushParams为具体应用的包名

storage_settings

HOME-存储界面

battery

HOME-电池

biometrics_and_password_settings

HOME-生物识别和密码

lock_screen_password_title

HOME-生物识别和密码-设置数字锁屏密码

change_six_to_number_entry

HOME-生物识别和密码-锁屏密码(其他密码类型)-自定义数字密码(设置锁屏数字密码)四级页面

change_six_to_mixed_entry

HOME-生物识别和密码-锁屏密码(其他密码类型)-混合密码(设置锁屏密码)四级页面

fingerprint_settings_entry

HOME-生物识别与密码-指纹3级页面

需看具体设备是否支持指纹解锁能力

privacy_settings

HOME-隐私与安全

location_help_entry

HOME-隐私与安全-定位服务-帮助四级页面

users_accounts

HOME-用户和账户

current_user

HOME-用户和账户-当前登录(用户)三级页面

system_and_updates

HOME-系统和更新

time_zone_settings

HOME-系统和更新-日期时间-时区-时区选择列表

date_and_time

HOME-系统和更新-日期时间三级页面

set_inputHOME-系统和更新-输入法页面

set_language

HOME-系统和更新-语言和输入法-语言和输入法四级页面

set_language_region

HOME-系统和更新-语言和输入法-语言和地区-语言和地区5级页面

reset_settings

HOME-系统和更新-重置三级页面

developer_options_settings

HOME-系统和更新-开发人员选项三级页面

edit_language_entry

HOME-系统和更新-语言和输入法-语言和地区-编辑(编译语言)五级页面

add_language_entry

HOME-系统和更新-语言和输入法-语言和地区-添加语言五级页面

select_region_entry

HOME-系统和更新-语言和输入法-语言和地区-当前地区(选择地区)五级页面

reset_factory_settings

HOME-系统和更新-重置-恢复出厂设置四级页面

reset_net_settings

HOME-系统和更新-重置-还原网络设置四级页面

reset_confirm_settings

HOME-系统和更新-重置-恢复出厂设置-重置手机五级页面

reset_net_confirm_settings

HOME-系统和更新-重置-还原网络设置-还原网络设置确认五级页面

about_device

HOME-关于本机界面

device_name

HOME-关于本机-设备名称

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter notebook和Conda使用

Jupyter notebook和Conda使用 文章目录 Jupyter notebook和Conda使用AnacondaJupyter notebook简介页面使用技巧编写格式自动补全查看函数文档魔术命令远程访问交互式 Anaconda Anaconda是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项…

stm32实现esp8266连接到TCP服务器(二)未完

1.2 连接到TCP Server 1.2.1 使用网络助手&#xff0c;设立TCP服务器 ​ 编辑 1.2.2 连接服务器 ATCIPSTART"TCP","192.168.1.18",8080 //指令&#xff0c;注意双引号逗号都要半角(英文)输入 CONNECT //结果&#xff1a;成功 OK //结果&#xff1a;成功 …

jmeter中用csv data set config做参数化2

在jmeter中&#xff0c;使用csv data set config进行参数化是很重要的一个功能&#xff0c;但是这个功能的使用需要十分仔细和小心&#xff0c;因为细节之处往往决定着结果的正确与否。 举例&#xff1a; 一个登录接口用加密密码登录&#xff0c;一个登录接口用原始密码登录。…

STM32G4系列MCU的低功耗模式介绍

目录 概述 1 认识低功耗模式 1.1 低功耗模式的应用 1.2 低功耗模式介绍 2 低功耗模式的状态关系 2.1 低功耗模式可能的转换状态图 2.2 低功耗模式总结 3 运行模式 3.1 减慢系统时钟 3.2 外围时钟门控 3.3 低功耗运行模式&#xff08;LP运行&#xff09; 概述 本文主…

JavaFx学习--chapter02(网络对话)

chapter02(网络对话) 简单网络对话程序 设计任务&#xff1a;客户端向服务器发送字符串&#xff0c;并能读取服务器返回的字符串。 知识点&#xff1a;TCP套接字技术&#xff0c;C/S软件架构程序设计 重点理解&#xff1a;Java客户套接字类Socket和服务器套接字类ServerSoc…

蜜罐技术的出现究竟影响了什么

自网络诞生以来&#xff0c;攻击威胁事件层出不穷&#xff0c;网络攻防对抗已成为信息时代背景下的无硝烟战争。然而&#xff0c;传统的网络防御技术如防火墙、入侵检测技术等都是一种敌暗我明的被动防御&#xff0c;难以有效应对攻击者随时随地发起的无处不在的攻击和威胁。蜜…

linux线程 | 同步与互斥 | 互斥(下)

前言&#xff1a;本篇文章主要讲述linux线程的互斥的知识。 讲解流程为先讲解锁的工作原理&#xff0c; 再自己封装一下锁并且使用一下。 做完这些就要输出一堆理论性的东西&#xff0c; 但博主会总结两条结论&#xff01;&#xff01;最后就是讲一下死锁。 那么&#xff0c; 废…

什么是 Idempotence 以及它在哪里使用?

大家好&#xff0c;我是锋哥。今天分享关于【什么是 Idempotence 以及它在哪里使用&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是 Idempotence 以及它在哪里使用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Idempotence&am…

【C++STL】list的基本介绍与使用方式

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 一、list的介绍 文档内容以及大致翻…

ESP32-IDF 非易失存储 NVS

目录 零、前言一、基本介绍1、配置结构体1.1 nvs_entry_info_t 2、常用 API2.1 nvs_flash_init2.2 nvs_flash_init_partition2.3 nvs_flash_init_partition_ptr2.4 nvs_flash_erase2.5 nvs_flash_erase_partition2.6 nvs_flash_erase_partition_ptr2.7 nvs_flash_generate_keys…

element plus中menu菜单技巧

我在使用element plus的menu&#xff08;侧边栏&#xff09;组件的过程中遇到了一些问题&#xff0c;就是menu编写样式和路由跳转&#xff0c;下面给大家分享以下&#xff0c;我是怎么解决的。 1.页面效果 我要实现的网站布局是这样的&#xff1a; 侧边栏折叠以后的效果&#…

python爬虫快速入门之---Scrapy 从入门到包吃包住

python爬虫快速入门之—Scrapy 从入门到包吃包住 文章目录 python爬虫快速入门之---Scrapy 从入门到包吃包住一、scrapy简介1.1、scrapy是什么?1.2、Scrapy 的特点1.3、Scrapy 的主要组件1.4、Scrapy 工作流程1.5、scrapy的安装 二、scrapy项目快速入门2.1、scrapy项目快速创建…

详解equals底层原理

equals 方法是 Java 中用于比较两个对象是否“相等”的方法。在 Java 中&#xff0c;每个类都继承自 java.lang.Object 类&#xff0c;而 equals 方法正是定义在 Object 类中的一个方法。默认情况下&#xff0c;Object 类的 equals 方法比较的是两个对象的内存地址&#xff08;…

SQL 多表联查

SQL JOIN (w3school.com.cn) SQL join用于根据两个或多个表中的列之间的关系&#xff0c;从这些表中查询数据。 之前跟着老师学数据库的时候学过&#xff0c;最近又在比较频繁的使用&#xff0c;再复习一下。 Person表&#xff1a; Id_P &#xff1a;居民编号。主键 …

大数据开发基于Hadoop+springboot平台的岗位推荐系统

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 随着网络科学技术不断的发展和普及化&#xff0c;用户在寻找适合自己的信息管理系统时面临着越来…

成功解决pycharm软件中按住Ctrl+点击指定函数却不能跳转到对应库中的源代码

成功解决pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 目录 解决问题 解决方法 解决问题 在pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 解决方法

探索秘境:如何使用智能体插件打造专属的小众旅游助手『小众旅游探险家』

文章目录 摘要引言智能体介绍和亮点展示介绍亮点展示 已发布智能体运行效果智能体创意想法创意想法创意实现路径拆解 如何制作智能体可能会遇到的几个问题快速调优指南总结未来展望 摘要 本文将详细介绍如何使用智能体平台开发一款名为“小众旅游探险家”的旅游智能体。通过这…

个人健康系统|个人健康数据管理系统|基于小程序+java的个人健康数据管理系统设计与实现(源码+数据库+文档)

个人健康数据管理系统 目录 基于小程序java的个人健康数据管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识&#xff0c;但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后&#xff0c;就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构&#xff0c;项目位于 GitH…

web3学习-区块链基础知识

1.1 区块链技术简史 block chain 点对点的分布式交易系统 比特币协议并不是图灵完备的。 以太坊协议加入了智能合约&#xff0c;智能合约是以太坊协议与比特币协议的最大区别&#xff08;图灵完备&#xff09; 1.2、区块链设计哲学 去中心化 由于没有中心化的数据库作为…