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

【鸿蒙实战开发】HarmonyOS集成高德地图定位实现

背景

随着HarmoneyOS 应用的井喷式增长,各大厂商也都加快了自己原生应用鸿蒙化的脚步,今天使用高德打车的时候忽然间想到高德在鸿蒙上有没有实现呢?打开next bate 版本的手机发现高德已经上架了,但是功能还不是特别完善。那么几乎每个应用都会用到高德的一些定位或者地图SDK他们是否跟其他平台一样方便集成呢?

说干就干!

回到家立马打开高德官网,发现鸿蒙星河版的定位、地图、导航SDK已经上线了

image.png

那今天就小试牛刀,实现一下鸿蒙星河版的定位SDK集成

集成过程

首先我们点击sdk 的类目进去后查看入门指南可以看到基础要求

image.png

从第三步开始这里有的同志可能就有点迷惑了,所以我们直接从第三步开始讲解

这里说到我们要拿到appid

我们在page的方法中添加如下代码来实现appid的获取(代码如下)

aboutToAppear(): void {
let flag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
let bundleInfo = bundleManager.getBundleInfoForSelfSync(flag)
let appId = bundleInfo.signatureInfo.appId;
this.appid=appId
}

image.png

可以看到控制台已经打印出了appid 的字符串,我们需要把他复制出来,等一下要使用这个appid

拿到appid之后进入到高德控制台开始创建我们的应用

image.png

填写好应用名称后选择类型,然后新建

image.png

Key 名称根据规则填写,然后选择HarmoneyOS NEXT平台,把我们刚才复制的appid粘贴上去,点击提交

image.png

提交成功后就为我们创建了一个应用,我们把key复制下来,等会就用这个key来进行定位的鉴权

接下来我们开始定位项目的配置

第一步,配置 module.json5首先,声明权限

"requestPermissions": [{"name": "ohos.permission.APPROXIMATELY_LOCATION","reason": "$string:Harmony_location_permission_reason","usedScene": {"abilities": ["Harmony_location_demoAbility"],"when": "always"}},{"name": "ohos.permission.LOCATION","reason": "$string:Harmony_location_permission_reason","usedScene": {"abilities": ["Harmony_location_demoAbility"],"when": "always"}},{"name": "ohos.permission.LOCATION_IN_BACKGROUND","reason": "$string:Harmony_location_permission_reason","usedScene": {"abilities": ["Harmony_location_demoAbility"],"when": "always"}},{"name": "ohos.permission.INTERNET","reason": "$string:Harmony_location_permission_reason","usedScene": {"abilities": ["Harmony_location_demoAbility"],"when": "always"}},{"name": "ohos.permission.KEEP_BACKGROUND_RUNNING","reason": "$string:Harmony_location_permission_reason","usedScene": {"abilities": ["Harmony_location_demoAbility"],"when": "always"}}]
...
Json

第二步,在工程的oh-package.json5文件中添加定位开发包从"dependencies": { “@amap/amap_lbs_common”: “>=1.0.2”, “@amap/amap_lbs_location”: “>=1.0.1”}Json

第三步,初始化定位

1导入所需模块

import { AMapLocationManagerImpl } from '@amap/amap_lbs_location';
import { AMapPrivacyAgreeStatus, AMapPrivacyInfoStatus, AMapPrivacyShowStatus } from '@amap/amap_lbs_common';
import { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import abilityAccessCtrl, { PermissionRequestResult } from '@ohos.abilityAccessCtrl';
import { BusinessError } from '@ohos.base';

2设置 Key(获取Key),并初始化隐私政策,

 创建AMapLocationManagerImpl
locationManger?: AMapLocationManagerImpl; 
private context = getContext(this);onPageShow() {//设置KeyAMapLocationManagerImpl.setApiKey("您的key");//初始化隐私政策AMapLocationManagerImpl.updatePrivacyShow(AMapPrivacyShowStatus.DidShow, AMapPrivacyInfoStatus.DidContain, getContext(this))AMapLocationManagerImpl.updatePrivacyAgree(AMapPrivacyAgreeStatus.DidAgree, getContext(this))//创建AMapLocationManagerImplthis.locationManger = new AMapLocationManagerImpl(this.context);
}
Json

3动态申请相关权限

  reqPermissionsFromUser(permissions: Array<Permissions>): void {let context: Context = getContext(this) as common.UIAbilityContext;let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗atManager.requestPermissionsFromUser(context, permissions).then((data: PermissionRequestResult) => {let grantStatus: Array<number> = data.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续访问目标操作} else {// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限return;}}// 授权成功}).catch((err: BusinessError) => {console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);})}提示
在onPageShow生命周期函数中调用该方法this.reqPermissionsFromUser(['ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.LOCATION',
]); 

这样我们的工程配置就完成了,当我们打开应用后可以发现获取权限的弹窗提示(如图所示)

image.png

然后继续进行单次定位的配置

首先是单次定位模块的导入

import { AMapLocationOption, AMapLocationReGeocodeLanguage, AMapLocationType, IAMapLocationListener } from '@amap/amap_lbs_location';
import geoLocationManager from '@ohos.geoLocationManager';

然后自定一个openLocation的方法,我们使用一个按钮来触发单词定位功能(初始界面如下)
image.png

通过点击开启定位,来执行单次定位的方法,从而获取经纬度

openLocation方法如下

openLocation(){let options: AMapLocationOption = {priority: geoLocationManager.LocationRequestPriority.FIRST_FIX, //定位优先配置选项scenario: geoLocationManager.LocationRequestScenario.UNSET, //定位场景设置maxAccuracy: 0, //定位精度 单位:米singleLocationTimeout: 3000, //指定单次定位超时时间locatingWithReGeocode: false, //定位是否返回逆地理信息reGeocodeLanguage: AMapLocationReGeocodeLanguage.Chinese, //逆地址语言类型isOffset: false //是否加偏}let listener: IAMapLocationListener = {onLocationChanged: (location) => {this.locationInfo=location}, onLocationError: (error) => {}};
this.locationManger?.setLocationListener(AMapLocationType.Single,listener) //设置定位信息监听this.locationManger?.setLocationOption(AMapLocationType.Single,options) //设置定位配置项this.locationManger?.requestSingleLocation() //单次定位}在button的点击事件中调用Button("开启定位").onClick(()=>{this.openLocation()})

image.png

可以看到已经获取到了,当前的经纬度,这样高德的定位功能就完美实现了

写在最后

●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
●更多鸿蒙最新技术知识点,请移步前往小编:https://gitee.com/

在这里插入图片描述

http://www.lryc.cn/news/510569.html

相关文章:

  • ECharts散点图-气泡图,附视频讲解与代码下载
  • python操作Elasticsearch执行增删改查
  • 学习C++:关键字
  • FFmpeg在python里推流被处理过的视频流
  • 为什么推荐使用构造函数注入而非@Autowired注解进行字段注入
  • 如何卸载和升级 Angular-CLI ?
  • 在线excel编辑(luckysheet)
  • 【ES6复习笔记】Symbol 类型及其应用(9)
  • [原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0
  • 【ES6复习笔记】Class类(15)
  • 【Golang 面试题】每日 3 题(六)
  • openEuler安装OpenGauss5.0
  • 20241230 机器学习ML -(1)线性回归(scikitlearn)
  • MacOS下TestHubo安装配置指南
  • mysql性能问题排查
  • centos单机部署seata
  • YOLOv9-0.1部分代码阅读笔记-lion.py
  • 运行Zr.Admin项目(前端)
  • HarmonyOS NEXT 实战之元服务:静态多案例效果(一)
  • go下载依赖提示连接失败
  • JS 异步 ( 二、Promise 的用法、手写模拟 Promise )
  • 五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)
  • 【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点
  • 灵当CRM uploadfile.php 文件上传致RCE漏洞复现
  • Linux下Java通过JNI调用C++
  • 解决:excel鼠标滚动幅度太大如何调节?
  • Git和SVN有什么区别?
  • 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。
  • 【ES6复习笔记】解构赋值(2)
  • Dockerfile的用法