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

news2024/11/27 0:45:20

关键词:鸿蒙、程序访问控制、定位、应用详情页、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.NULL
  return 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', //设置应用bundleName
    abilityName: 'com.huawei.hmos.settings.MainAbility', //设置应用abilityName
    uri: "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', //设置应用bundleName
    abilityName: 'com.huawei.hmos.settings.MainAbility', //设置应用abilityName
    uri: "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 = res
              console.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.coloradmin.cn/o/2219556.html

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

相关文章

mov 转 mp4

1. 下载 ffmpeg 下载链接 Tags GyanD/codexffmpeg GitHub 下载 windos 精简版 解压 &#xff08;里面的mov文件和mp4文件是我后面自己加的&#xff09; 2. 转换 转换命令 ffmpeg -i 5.mov -c:v libx264 -c:a aac 5.mp4 其中 5.mov 是源文件路径 5.mp4是目标路径 使用lib…

计算机毕业设计 零食批发商仓库管理系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

智发展 智飞跃 亚信安全与新华三深化战略合作

10月16日&#xff0c;亚信安全与新华三集团共同宣布&#xff0c;双方正式签署战略合作协议&#xff0c;双方将基于各自在硬件及软件安全领域的能力和优势&#xff0c;在产品、解决方案、市场拓展等多个领域深入合作&#xff0c;赋能千行百业数字化转型与变革。 亚信安全CEO马红…

跨域问题及常用的5种解决方案

1.什么是跨域问题&#xff1f; 跨域问题通常指的是在浏览器中由于同源策略的限制而产生的问题。同源策略&#xff08;Same-origin policy&#xff09;是浏览器的一种安全措施&#xff0c;它要求请求的域名、协议和端口必须与提供资源的网站相同。当一个网页尝试访问另一个来源…

【算法】C++中的二分查找

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

wifi、热点密码破解 - python

乐子脚本&#xff0c;有点小慢&#xff0c;试过多线程&#xff0c;系统 wifi 连接太慢了&#xff0c;需要时间确认&#xff0c;多线程的话系统根本反应不过来。 也就可以试试破解别人的热点&#xff0c;一般都是 123456 这样的傻鸟口令 # coding:utf-8 import pywifi from pyw…

初识git · 基本操作

目录 前言&#xff1a; 基本操作 检查是否存在git 初始化仓库 认识三个区域 添加文件 查看.git文件 修改文件 版本回退 撤销操作 删除文件 我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;https://cloud.tencent.com/developer/suppor…

Qt-多线程

1. Qt 多线程概述 Qt 默认只有一个主线程&#xff0c;该线程既要处理窗口移动&#xff0c;又要处理各种运算。 当要处理的运算比较复杂时&#xff0c;窗口就无法移动&#xff0c;所以在处理程序时在很多情况下都需要使用多线程来完成。 示例&#xff1a;移动窗口和复杂循环 …

八股面试2(自用)

mysql存储引擎 存储引擎&#xff1a;定义数据的存储方式&#xff0c;以及数据读取的实现逻辑 在以前数据库5.5默认MyISAM引擎&#xff0c;之后默认InnoDB引擎 MyISAM引擎的数据和索引是分开存储的&#xff0c;InnoDb将索引和文件存储在同一个文件。 MyISAM不支持事务&#…

SPOOLing技术详解,结合实际场景让你了解什么是假脱机技术。

SPOOLing技术 ​ 在手工操作阶段&#xff0c;主机直接从I/O设备获取数据&#xff0c;但是由于设备速度很慢&#xff0c;主机速度很快。人机速度矛盾明显&#xff0c;主机需要浪费很多时间来等待设备。 什么是脱机技术&#xff0c;脱机技术可以解决什么问题&#xff1f; 所谓脱…

大数据测试:Charles修改响应数据

上一篇大数据测试&#xff1a;Fiddler修改响应数据-CSDN博客 &#xff0c;有同学反馈有没有Charles的方式修改响应数据&#xff0c;本篇就是Charles修改数据操作步骤&#xff0c;相比较fiddler&#xff0c;Charles相对简单&#xff0c;便捷&#xff0c;我很喜欢 1、背景&…

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

&#xff08;一&#xff09;启动 创建环境python3.9 打开此环境终端 &#xff08;后面的语句操作几乎都在这个终端执行&#xff09; 输入up主提供的语句&#xff1a;pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址&#xff1a; Start Locally | P…

java -jar 命令自动重启 Java 项目

一、java -jar 方式运行项目 重启Java项目通常意味着你需要先停止当前运行的Java进程&#xff0c;然后再次启动它。下面是在CentOS上执行这些步骤的一种常见方法&#xff1a; 停止Java进程 找到Java进程的PID&#xff1a; 使用ps命令配合grep来查找运行中的Java进程的PID&#…

【Java SE 】封装 的特性 和 static 详解

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 封装的概念 1.1 一个例子 2. 访问权限控制符 3. 包的概念 3.1 import 导入 3.2 常见的包 4. static 静态成员 4.1 static 使用情况 4.2 static 修…

> Invalid revision: 3.22.1-g37088a8-dirty

Android项目使用cmake 3.22.1&#xff0c;编译时报错&#xff1a; > Invalid revision: 3.22.1-g37088a8-dirty解决方法一&#xff1a; 升级Gradle版本和AGP的版本&#xff1b; 建议使用AS推荐的版本&#xff1a; 目前可运行的版本配置&#xff1a; AS&#xff1a;Jel…

champ模型部署指南

一、介绍 champ是由阿里巴巴、复旦大学和南京大学的研究人员共同提出的一种基于3D的将人物图片转换为视频动画的模型&#xff0c;该方法结合了3D参数化模型(特别是SMPL模型)和潜在扩散模型&#xff0c;能够精确地捕捉和再现人体的3D形状和动态&#xff0c;同时保持动画的时间一…

读书读到NOBEL

最近在读陈逸鹤的《程序员的自我修养》这本书&#xff0c;里面有这么一段话&#xff1a; “远古时代的人们只能创造出用于猎捕的长矛&#xff0c;而今天借助来自各行各业人 们的智慧&#xff0c;我们可以制造出高铁、大型飞机&#xff0c;并探索宇宙。但要更进一步解决人类所面…

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…

GPT-4o canvas不是对cursor的颠覆,而是人与AI交互的新探索

谈一下Openai新发布的canvas。 关于这个产品的介绍不多说了&#xff0c;网上已经有很多&#xff0c;主要谈下我对它以及相似竞品的比较&#xff0c;以及我的一些看法。 1、vs Claude Artifacts&#xff1a;是chatbot编程方面直接竞品&#xff0c;不过现阶段还是有很大的区别。…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…