当前位置: 首页 > java >正文

HarmonyOS实战:高德地图自定义定位图标展示

前言

地图定位功能基本上已经成了日常应用程序的必备功能之一,在日常开发地图定位的功能的时候难免会遇到很多意想不到的问题,本篇文章记录日常开发过程中的细节与完整的流程,帮助更多的开发者避免遇到类似的问题,建议点赞收藏!

实现效果

需求分析

  • 首先需要实现一个自定义的图标替代系统默认的箭头。
  • 获取定位权限与位置信息。
  • 获取定位结果并展示当前位置。

技术实现

  1. 在鸿蒙的实际开发过程中,地图定位权限首先需要申请两个权限,分别是:
const permissions: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.LOCATION'
]static applyPermission(context: common.UIAbilityContext, permissions: Array<Permissions>, grantedBlock: () => void,deniedBlock?: () => void) {let atManager = abilityAccessCtrl.createAtManager()let permissionGrantedNumber: number = 0 //记录已经授权的总个数atManager.requestPermissionsFromUser(context, permissions).then((data) => {for (let index = 0; index < data.authResults.length; index++) {if (data.authResults[index] == 0) { //已授权permissionGrantedNumber++;}}if (permissionGrantedNumber == permissions.length) {grantedBlock()} else {if (deniedBlock) {deniedBlock()} else {//打开系统设置PermissionUtil.openPermissionsInSystemSettings(context)}}})
}

2. 两个权限必须同时申请,缺一不可,同时如果权限是被拒绝过的,那就要手动打开系统设置,跳转到对应应用程序的位置提示用户手动打开权限。

 let bundleInfo: bundleManager.BundleInfo =await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);let wantInfo: Want = {bundleName: 'com.huawei.hmos.settings',abilityName: 'com.huawei.hmos.settings.MainAbility',uri: 'application_info_entry',parameters: {settingsParamBundleName: bundleInfo.name}}context.startAbility(wantInfo).then(() => {})
  1. 得到系统授权后,开始使用高德定位。
 let listener: IAMapLocationListener = {onLocationChanged: (location) => {console.info('地图定位成功:  ')}, onLocationError: (e) => {console.info('地图定位失败:  ' + JSON.stringify(e))if (!this.hasUserLocation) {// 尝试获取缓存位置this.getLastLocation(success, error)}}};LocationManager.getInstance().addListener(listener)
  1. 定位成功后,添加用户自定义的图标。
 this.aMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(userLat,userLon), 15));let options: MarkerOptions = new MarkerOptions();options.setPosition(new LatLng(userLat, userLon));options.setIcon(await BitmapDescriptorFactory.fromView(() => {this.customMarkerBuilder()}))this.aMap?.addMarker(options);//自定义图标@BuildercustomMarkerBuilder(){Image($r("app.media.user_location_icon")).width($r('app.float.vp_40')).height($r('app.float.vp_40'))}
  1. 这里需要特别注意经纬度 userLat,userLon 必须是 float 类型,不然定位不准。这点一定要注意。因为鸿蒙没有提供 float 类型的属性,这里需要使用 Number.parseFloat 对数据进行转换。(真实惨痛经历,定位跑到欧洲去了)。
  2. 当完成这些操作,大多数人都认为基本上可以正常显示了,但是万万没想到地图依然没有定位到当前位置。这是因为很多人忽略了系统的 GPS 定位按钮是否打开,也就是系统下拉菜单中的位置图标。

  1. 必须在检查权限的时候,检查系统位置开关是否打开。
  let location =  geoLocationManager.isLocationEnabled()console.log("定位权限是否开启:"+location)
  1. 如果没有打开,则需要跳转到系统对应的位置提示用户打开。
 context.startAbility({bundleName: "com.huawei.hmos.settings",abilityName: "com.huawei.hmos.settings.MainAbility",uri: "location_manager_settings"},
  1. 完成以上操作,地图就能正常显示自定义位置图标了。

总结

鸿蒙对于位置权限要求十分严格,必须同时满足两个权限申请,同时也要注意 GPS 的位置开关是否正常打开。另外特别注意的是经纬度是否是 float 类型,否则会导致位置跑偏。学会的小伙伴赶紧动手试试吧!

http://www.xdnf.cn/news/8033.html

相关文章:

  • Redis 5.0.10 集群部署实战(3 主 3 从,三台服务器)
  • 深度学习模型部署:使用Flask将图像分类(5类)模型部署在服务器上,然后在本地GUI调用。(全网模型部署项目步骤详解:从模型训练到部署再到调用)
  • RAGFlow知识检索原理解析:混合检索架构与工程实践
  • Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的管理与运营策略研究
  • 格雷希尔快速封堵接头,解决新能源汽车的气密性检测和三电系统的综合测试
  • java 基础知识巩固
  • 深度解析:Spark、Hive 与 Presto 的融合应用之道
  • SpringBoot Day_03
  • Docker 与微服务架构:从单体应用到容器化微服务的迁移实践
  • 谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA
  • 基于STM32F4的cubemx关于RTC配置说明
  • Docker架构详解
  • Win 系统 conda 如何配置镜像源
  • 【二刷力扣】【力扣热题100】今天的题目是:两数之和
  • Spring核心原理:动态数据源切换的企业级解决方案
  • springboot03
  • MqSQL
  • Oracle 11G RAC重启系统异常
  • WPF读取json文件,用到combox控件
  • 设计双向链表--LeetCode
  • 如果验证集缺失或测试集缺失应该怎么办?
  • 常见的游戏服务器架构有哪些?
  • WebSphere Application Server(WAS)8.5.5教程第十讲
  • Kotlin 极简小抄 P9 - 数组(数组的创建、数组元素的访问与修改、数组遍历、数组操作、多维数组、数组与可变参数)
  • 漏洞修复的两种核心方法
  • Chord Crossing_abc405分析与解答
  • 第21天-pyttsx3语音播放功能
  • js逆向练习 客户端的加密数据的逆向
  • 8.数据驱动的决策分析与可视化实践