前言
地图定位功能相信很多人都用过,在鸿蒙的应用程序开发中,使用高德地图的定位功能变得十分常见,那么在鸿蒙中一次完整的地位功能怎么实现?如果定位失败了,能否获取前几次的定位呢?本篇文章带你实现一个完整的定位功能流程,建议点赞收藏!
需求分析
要想实现一个完整的定位需求流程,就必须要做好准备工作,了解实现需求的具体步骤。
- 权限申请
- 检查 GPS 是否打开
- 单次定位还是多次定位
- 定位失败处理
技术实现
要想实现一次完整的定位流程,必须根据需要分析一步步去实现,由于高德地图的引入太过于简单,这里一笔带过。重点讲解完整实现的步骤。
- 添加基本定位权限,在 entry 模块下的 module.json5 中添加定位必要的两个权限。
{
// user_grant
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:location_permissions_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
{
// user_grant
"name": "ohos.permission.LOCATION",
"reason": "$string:location_permissions_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
- 在页面中进行权限申请,一般是在 onPageShow 生命周期方法中申请,先检查系统 GPS 定位开关是否开启,如果没有开启则提示用户跳转到系统指定位置打开。
let location = geoLocationManager.isLocationEnabled()
if (!location) {
let dialog = new OpenSystemGPSEHelper()
dialog.show(this.getUIContext(),getContext(this) as common.UIAbilityContext,()= >{
this.currentCity = "定位失败"
})
}
//GPS跳转页面
context.startAbility(
{
bundleName: "com.huawei.hmos.settings",
abilityName: "com.huawei.hmos.settings.MainAbility",
uri: "location_manager_settings"
},
- 确认 GPS 打开之后,开始 申请 用户权限。
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)
}
}
})
}
- 如果用户打开权限,则直接开始定位服务,否则提示用户跳转到系统指定位置打开权限。
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(() = > {
})
- 确认定位权限没问题后,开始定位,高德提供的定位有多次和单次,这里使用单次定位。
let listener: IAMapLocationListener = {
onLocationChanged: (location) = > {
console.log("当前定位1:"+location.latitude+",---longitude:"+location.longitude)
this.transformCity(location.latitude,location.longitude)
}, onLocationError: (error) = > {
}
};
LocationManager.getInstance().addListener(listener)
LocationManager.getInstance().initLocation()
// 定位参数配置
let options: AMapLocationOption = {
//定位优先配置选项
priority: geoLocationManager.LocationRequestPriority.FIRST_FIX,
//定位场景设置
scenario: geoLocationManager.LocationRequestScenario.UNSET,
//定位精度 单位:米
maxAccuracy: 0,
//指定单次定位超时时间
singleLocationTimeout: 3000,
//定位是否返回逆地理信息
locatingWithReGeocode: true,
//逆地址语言类型
reGeocodeLanguage: AMapLocationReGeocodeLanguage.Chinese,
isOffset: false //是否加偏
}
// 设置配置
this.locationManger?.setLocationOption(AMapLocationType.Single, options)
if (this.listener != undefined) {
// 监听
this.locationManger?.setLocationListener(AMapLocationType.Single, this.listener)
}
// 启动定位
this.locationManger?.requestSingleLocation()
- 定位成功拿到定位的信息,在实际开发中尽管设置中已经设置返回逆地理信息,但并没有返回具体信息,这点实在是无法理解,只能得到当前位置的经纬度。这个时候需要将经纬度转换为当前位置名称。
- 在开发中通过使用华为官方系统中的 api,对经纬度进行逆编码才能获取准备的位置名称。
let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude":latitude, "longitude":longitude, "maxItems": 1};
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) = > {})
- 如果地图定位失败,则可以根据高德地图提供的方法,尝试拿取历史定位信息。
LocationManager.getInstance().getLastLocation({
onLocationChanged: (location) = > {
console.info('地图定位缓存获取成功: ' + JSON.stringify(location))
if (success) {
success()
}
}, onLocationError: (e) = > {
console.info('地图定位缓存获取失败: ' + JSON.stringify(e))
if (success) {
success()
}
}
})
- 如果历史定位信息也获取失败,这时就能使用默认定位位置了。
总结
定位功能实现起来比较简单,但是完整的定位流程及细节处理才是本篇文章的关键,相信看完本篇文章你已经学会在鸿蒙中怎么使用高德定位功能了,快去动手尝试一下吧!
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
定位
+关注
关注
5文章
1553浏览量
36513 -
HarmonyOS
+关注
关注
80文章
2146浏览量
35537
发布评论请先 登录
相关推荐
热点推荐
【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果
【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果
LuatOS AGPS 辅助定位开发实战教程
为解决传统 GPS 定位慢、功耗高的痛点,AGPS 技术通过辅助数据注入提升效率。本教程以 LuatOS 开发环境为基础,循序渐进地讲解 AGPS 辅助定位的开发流程,包括 AGPS
【HarmonyOS 5】鸿蒙星闪NearLink详解
【HarmonyOS 5】鸿蒙星闪NearLink详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 鸿蒙星闪NearLink Kit
是德示波器MSOX3104A自动测量功能详解与实战技巧
一、引言 在电子工程、通信调试、自动化控制等领域,示波器是工程师不可或缺的测试工具。是德科技(Keysight)的MSOX3104A示波器凭借其高精度、多功能特性,尤其在自动测量功能上实现了智能化
鸿蒙地图功能开发【1. 开发准备】##地图开发##
对于地图功能的开发,有以下三种思路
使用鸿蒙官方的Map Kit进行开发
使用第三方地图的SDK(例如高德地图、百度
发表于 06-29 22:52
【HarmonyOS 5】桌面快捷方式功能实现详解
【HarmonyOS 5】桌面快捷方式功能实现详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在移动应用开发中,如何让用户快速
高德地图与Rokid达成合作
近日,高德地图与Rokid宣布达成合作,将共同推出基于全场景智能眼镜Rokid Glasses的全球首个导航智能体(NaviAgent)应用,标志着高
高德地图与长城汽车共建出行联合创新LAB
近日,高德地图与长城汽车在河北举行出行联合创新LAB揭牌仪式,双方将围绕导航出行领域展开深度合作,共创未来用户智慧出行新体验。与此同时,基于高德
长城汽车联手高德地图打造出行联合创新LAB
近日,长城汽车与高德地图基于长期良好的合作基础,联手打造的“出行联合创新LAB”正式在保定市长城汽车技术中心揭牌。根据共同约定,双方将通过出行联合创新LAB,发挥各自优势,共同研究、探索基于用户出行

HarmonyOS实战:高德地图定位功能完整流程详解
评论