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

前言

地图定位功能相信很多人都用过,在鸿蒙的应用程序开发中,使用高德地图的定位功能变得十分常见,那么在鸿蒙中一次完整的地位功能怎么实现?如果定位失败了,能否获取前几次的定位呢?本篇文章带你实现一个完整的定位功能流程,建议点赞收藏!

需求分析

要想实现一个完整的定位需求流程,就必须要做好准备工作,了解实现需求的具体步骤。

  • 权限申请
  • 检查 GPS 是否打开
  • 单次定位还是多次定位
  • 定位失败处理

技术实现

要想实现一次完整的定位流程,必须根据需要分析一步步去实现,由于高德地图的引入太过于简单,这里一笔带过。重点讲解完整实现的步骤。

  1. 添加基本定位权限,在 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"
    }
    },

  2. 在页面中进行权限申请,一般是在 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"
    
           },
  3. 确认 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)
    }
    }
    })
    }

  4. 如果用户打开权限,则直接开始定位服务,否则提示用户跳转到系统指定位置打开权限。

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

  5. 确认定位权限没问题后,开始定位,高德提供的定位有多次和单次,这里使用单次定位。

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

  6. 定位成功拿到定位的信息,在实际开发中尽管设置中已经设置返回逆地理信息,但并没有返回具体信息,这点实在是无法理解,只能得到当前位置的经纬度。这个时候需要将经纬度转换为当前位置名称。

  7. 在开发中通过使用华为官方系统中的 api,对经纬度进行逆编码才能获取准备的位置名称。

    let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude":latitude, "longitude":longitude, "maxItems": 1};
    try {
    geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {})

  8. 如果地图定位失败,则可以根据高德地图提供的方法,尝试拿取历史定位信息。

    LocationManager.getInstance().getLastLocation({
    onLocationChanged: (location) => {
    console.info('地图定位缓存获取成功: ' + JSON.stringify(location))

    复制代码
         if (success) {
           success()
         }
       }, onLocationError: (e) => {
         console.info('地图定位缓存获取失败:  ' + JSON.stringify(e))
       
         if (success) {
           success()
         }
       }
     })
  9. 如果历史定位信息也获取失败,这时就能使用默认定位位置了。

总结

定位功能实现起来比较简单,但是完整的定位流程及细节处理才是本篇文章的关键,相信看完本篇文章你已经学会在鸿蒙中怎么使用高德定位功能了,快去动手尝试一下吧!

相关推荐
二二孚日3 小时前
自用华为ICT云赛道AI第三章知识点-MindSpore特性、MindSpore开发组件
人工智能·华为
Georgewu3 小时前
【HarmonyOS 5】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解
harmonyos
塞尔维亚大汉4 小时前
鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc 进程通讯内容
harmonyos·源码阅读
Georgewu4 小时前
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页
harmonyos
ajassi20006 小时前
开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储
linux·开源·harmonyos
塞尔维亚大汉6 小时前
鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式
harmonyos·源码阅读
生如夏花℡10 小时前
HarmonyOS学习记录4
学习·华为·harmonyos
九章云极AladdinEdu10 小时前
华为昇腾NPU与NVIDIA CUDA生态兼容层开发实录:手写算子自动转换工具链(AST级代码迁移方案)
人工智能·深度学习·opencv·机器学习·华为·数据挖掘·gpu算力
xq952710 小时前
编程之路2025年中总结,勇往直前 再战江湖
harmonyos
枫叶丹411 小时前
【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 动态修改编译配置
华为·harmonyos·deveco studio·harmonyos next