#HarmonyOS NEXT体验官# HarmoneyOS Next集成高德定位 原创
背景
随着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()
})
可以看到已经获取到了,当前的经纬度,这样高德的定位功能就完美实现了