您的当前位置:首页正文

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

2024-11-06 来源:个人技术集锦
背景

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

说干就干!

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

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

集成过程

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

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

这里说到我们要拿到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
}

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

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

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

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

提交成功后就为我们创建了一个应用,我们把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() {
  //设置Key
  AMapLocationManagerImpl.setApiKey("您的key");

  //初始化隐私政策
  AMapLocationManagerImpl.updatePrivacyShow(AMapPrivacyShowStatus.DidShow, AMapPrivacyInfoStatus.DidContain, getContext(this))
  AMapLocationManagerImpl.updatePrivacyAgree(AMapPrivacyAgreeStatus.DidAgree, getContext(this))

  //创建AMapLocationManagerImpl
  this.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',
]); 

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

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

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

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

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

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

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

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

写在最后

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

Top