百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HarmonyOS申请用户位置信息授权和再次授权

haoteby 2025-03-24 16:32 23 浏览

HarmonyOS申请用户位置信息授权和再次授权-系统级API获取地理位置的错误码类型问题getCurrentLocation()

应用场景

在许多的app中,都需要用到获取用户的地理位置这一功能,由于地理位置属于隐私级别较高的系统能力,所以要申请用户授权,但是在用户授权时,可能出现多种场景,用户不授权,用户授权了但是系统的定位功能没有打开,用户授权了但是由于其他因素(网络问题)导致的获取定位失败。在用户拒绝授权后,怎样再次发起二次授权请求。

不同API的二次授权方式不同

打开设置页面,二次申请权限,通过
UIAbilityContext.startAbility的固定写法打开设置页


  1. .onClick(async () => {

  2. const context = getContext() as common.UIAbilityContext

  3. const bundleInfo =
  4. bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)

  5. context.startAbility({
  6. bundleName: 'com.huawei.hmos.settings', // 固定写法CV:设置页的包名
  7. abilityName: 'com.huawei.hmos.settings.MainAbility', // 固定写法CV:设置页的 ability 名
  8. uri: 'application_info_entry', // 固定写法CV:打开 设置->应用和元服务
  9. parameters: {
  10. // 按照包名打开对应设置页
  11. pushParams: bundleInfo.name

根据返回值继续打开模态框的方法
abilityAccessCtrl.requestPermissionsFromUser()



  1. // 核心API: requestPermissionsFromUser()

  2. const atManager = abilityAccessCtrl.createAtManager()

  3. const result = await atManager.requestPermissionsFromUser(getContext(), ['ohos.permission.READ_CALENDAR'])
  4. AlertDialog.show({ message: JSON.stringify(result, null, 2) })
  5. if (result.authResults.includes(-1) && result.dialogShownResults?.includes(false)) {
  6. atManager.requestPermissionOnSetting(getContext(), ['ohos.permission.READ_CALENDAR'])



错误码返回值类型“坑”点

首先这里我们用的是动态根据返回值来判断用户是否有权限,是否需要打开二次授权的弹窗。

这里的
geoLocationManager.getCurrentLocation()如果失败,通过catch捕获错误,打印错误码发现,

//{"code": 201 } 用户未授权或拒绝授权

// {"code": "3301100" } 位置功能的开关未开启,模拟器下拉控制中心,打开定位开关

// {"code": 3301200 } 定位失败,未获取到定位结果

错误码201是数字类型,"3301100"是字符串,3301200又是数字类型,所以很容易在判断时产生错误,导致逻辑失败,所以要对错误码强制类型转换进行统一类型

Number((err as BusinessError).code),然后进行判断,根据不同类型决定要提醒用户还是打开二次授权申请

  1. const manager = abilityAccessCtrl.createAtManager()
  2. manager.requestPermissionsFromUser(getContext(), [
  3. 'ohos.permission.APPROXIMATELY_LOCATION'
  4. .onClick(async () => {

  5. const res = await geoLocationManager.getCurrentLocation()
  6. promptAction.showToast({ message: JSON.stringify(res) })
  7. } catch (err) {
  8. console.log('wgt666', JSON.stringify(err))

  9. // {"code": 201 } 用户未授权或拒绝授权
  10. // {"code": "3301100" } 位置功能的开关未开启,模拟器下拉控制中心,打开定位开关
  11. // {"code": 3301200 } 定位失败,未获取到定位结果
  12. // switch 处理错误情况,code 数据类型有坑
  13. switch (Number((err as BusinessError).code)) {
  14. case 201: {
  15. const manager = abilityAccessCtrl.createAtManager()
  16. const res = await manager.requestPermissionsFromUser(getContext(), [
  17. 'ohos.permission.APPROXIMATELY_LOCATION',
  18. 'ohos.permission.LOCATION'

  19. // promptAction.showToast({ message: JSON.stringify(res) })
  20. // 当用户拒绝授权后,再次点击,会返回false,此时需要引导用户去设置页面手动授权
  21. if (res.authResults.includes(-1) && res.dialogShownResults?.includes(false)) {
  22. manager.requestPermissionOnSetting(getContext(), [
  23. 'ohos.permission.APPROXIMATELY_LOCATION',
  24. 'ohos.permission.LOCATION'
  25. case 3301100: {
  26. promptAction.showToast({ message: '位置权限未开启' })
  27. promptAction.showToast({ message: '获取位置失败' })
  28. const manager = abilityAccessCtrl.createAtManager()

  29. bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)

  30. manager.checkAccessTokenSync(bundle.appInfo.accessTokenId, 'ohos.permission.APPROXIMATELY_LOCATION')
  31. promptAction.showToast({ message: res.toString() })

相关推荐

统统都能轻松装下。_如何安装统赢

今天必须来好好聊聊迈腾甄选款的外观升级优势,简直是把经典与时尚玩明白了!迈腾甄选款巧妙地保留了迈腾的经典气场和造型,就像一位历经岁月沉淀却风采依旧的绅士。2871mm的超长轴距搭配超短前后悬设计,这就...

麒麟操作系统常见问题:打开火狐浏览器提示没有安装flash插件

关键词:火狐浏览器、flash、插件、安装问题类型:...

VS Code 新手必装插件清单_vs code 安装插件

以下是针对VSCode新手的必装插件清单,覆盖代码编辑、效率提升、美化等核心需求,适用于大多数开发场景:一、基础必备插件Chinese(Simplified)(简体中文)功能:将VSC...

开源JSON可视神器,让阅读JSON变得简单!-JSONHero

众所周知,现在有不少代码编辑器以及在线工具,都支持JSON格式化,因此这一特性,已经不能称的上是亮点。调试工具已经成为每个开发者不可或缺的“利器”。但是,你见过能直接可视化JSON数据,把整个...

在NAS上部署Barcode服务_nas basic

部署基于BWIP-JS的条形码生成APIBWIP-JS是一个优秀的JavaScript条形码生成库,它支持多种条形码类型,并且可以运行在Node.js环境下,非常适合用来构建API服务。...

详细介绍一下Python如何对JSON格式数据进行处理?

在Python中对于JSON数据的处理是在日常开发中的常见需求之一。通常情况下,对JSON数据的处理主要涉及到如下的的几个步骤对于JSON数据的解析操作对于JSON数据的处理操作对于JSON数据的格式...

golang2021数据格式(69)Go语言将结构体数据保存为JSON格式数据

JSON格式是一种对象文本格式,是当前互联网最常用的信息交换格式之一。在Go语言中,可以使用json.Marshal()函数将结构体格式的数据格式化为JSON格式。想要使用json...

一个vsCode格式化插件_vscode 格式化文档

ESlint...

自己抓取家中IPTV组播地址,不用交换机或多网卡,远程抓取更方便

通过IPTV播放应用在电视、电脑或者手机观看家中的IPTV电视直播,可以摆脱IPTV机顶盒的限制,方便在家中多台电视或者手机电脑上观看IPTV电视直播。运营商IPTV的电视直播信号稳定、高清,和互联网...

扣子免费系列教程, 如何使用扣子(coze)对接飞书多维表格?

一、说明大家都知道使用扣子(coze)把一些文本内容转为小红书风格很方便。但每次都是复制粘贴。很麻烦那能不能批量呢?今天我们就来学习下,使用扣子(coze)平台完成内容的批量转换。基本思路是读取飞书多...

1024程序员节 花了三个小时调试 集合近50种常用小工具 开源项目

开篇1024是程序员节了,本来我说看个开源项目花半个小时调试之前看的一个不错的开源项目,一个日常开发常常使用的工具集,结果花了我三个小时,开源作者的开源项目中缺少一些文件,我一个个在网上找的,好多坑...

办公人必看!3分钟搞定JSON/XML/Markdown,格式转换竟如此简单!

你是不是也遇到过这些情况:领导突然甩来一份密密麻麻的数据文件,要你半小时内整理成报表;想写技术文档,却被Markdown的语法搞得头大;或者同事发来的JSON文件,打开全是“{”“}”“,”,看得眼花...

开发者必备!zerotools.top全栈效率神器

强烈建议开发者们收藏https://zerotools.top,用它来提升日常效率。一、功能覆盖:从数据到图像的全栈支持Zerotools.top的最大亮点,是其功能维度的完整性。根据最新页面...

15 个非常好用的 JSON 工具_json tools

JSON(JavaScriptObjectNotation)是一种流行的数据交换格式,已经成为许多应用程序中常用的标准。无论您是开发Web应用程序,构建API,还是处理数据,使用JSON工具可以大...

C#.NET Newtonsoft.Json 详解_c# jsonresult

简介Newtonsoft.Json(又称...