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

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

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

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() })

相关推荐

别争了,Access数据库才是真正的低代码开发平台

Access数据库是微软公司搞出来的“奇葩”产品。...

Access开发轻松一键将 Access 全库表格导出为 Excel

hi,大家好呀!在日常工作中,Access常常是我们忠实的数据管家,默默守护着项目信息、客户列表或是库存记录。它结构清晰,录入便捷,对于许多中小型应用场景来说,无疑是个得力助手。然而,当我们需要对这...

跟我学:从零开始用Access设计一套完整的系统(一)

序言:Access是一款强大而灵活的数据库软件,可以设计和开发各种类型和规模的数据库应用程序。本文旨在为您提供从零开始设计Access数据库系统的详细指导,并通过实际案例演示如何在Access中设计和...

问卷调查管理程序 Access数据库 功能介绍和VBA代码分享

o本系统包含主要功能有:问卷管理,题目管理,问卷填写,调查结果统计,数据汇总导出o数据库系统包含:表,查询,窗体,VBA代码...

非绑定记录窗体查看管理数据 Access数据库功能模块 VBA代码编程

模块Public成绩IDnumAsLong学生成绩管理PrivateSubCommand更新_Click()DoCmd.SetWarnings(False)...

ACCESS中的DLookUp函数是如何运算的?

一、DLookUp函数介绍1.DLookUp函数的用途:可以用于从指定集合(一个域)中获取符合条件的特定字段的值。2.DLookUp函数的格式为:DLookUp(expr,domain,...

Excel常用技能分享与探讨(5-宏与VBA简介 VBA之用户窗体-一)

用户窗体(UserForm)是VBA中创建交互式界面的核心工具,可用于数据录入、设置参数或展示信息。...

【每日任务计划管理系统】Access数据库管理系统 VBA代码分享

窗体系统主页文本框,组合框,按钮,子窗体OptionCompareDatabase...

VBA高效开发:用用户窗体打造个性化数据录入工具

在日常办公中,Excel的数据录入是否总让你陷入这些困境?手动输入易错、格式混乱难追溯、重复操作耗时费力。今天,我们将突破常规,利用VBA的用户窗体(UserForm)构建一套“智能校验、流程清晰、...

VBA编程(基于Access)第1课:VBA的作用和学习方法

VBA,英文全称VisualBasicforApplications,直接翻译过来叫做“可以直接使用的VB语言”。...

Access数据库宏与VBA代码的使用(精品一)

Access数据库的宏相当于实现某一功能的一系列命令和操作,我们无需写代码,系统已经将主体代码集成一块,我们只需要做一些简单的操作即可,而VBA代码则是实实在在的代码写到程序里面,我们可以自己编写,也...

【每日任务管理系统】(2) VB 管理系统 代码 Visual Basic access数据库

窗体全部任务DimdhAsLong'存储高度差DimdwAsLong'存储宽度差...

VBA连接access数据库开发软件(vba调用数据库连接)

VBA连接access数据库开发小软件虽然VBA(包括VB)已不再流行,但是在某些场合还是比较方便的,尤其对非编程专业人员。灵活使用VBA,可以很十分方便的处理excel,access数据,提高工作效...

九章云极发布全新AI智算云平台:支持秒级生成百万级Token

6月16日,在在九章云极智能计算科技论坛上,九章云极宣布推出全新AI智算云平台“九章智算云AlayaNeWCloud2.0”,该平台基于Serverless技术架构与强化学习技术(RL)的深度融合...

浅谈基于大数据技术下的“云旅游”平台运营策略研究

云旅游体验平台是利用大数据和虚拟技术,构建虚拟旅游环境,能够改变旅游企业的营销模式和旅游者的消费模式。本文从云旅平台多维度数据信息的获取与分析,平台体验质量反馈信息数据构建,云旅游平台服务功能设计方案...