一、前置配置
1.声明权限与协议
在module.json5
中添加权限和querySchemes
,用于检测高德地图是否安装:
"requestPermissions": [
{ "name": "ohos.permission.INTERNET" }, // 网络权限
{ "name": "ohos.permission.LOCATION" } // 定位权限
],
"abilities": [
{
"name": "EntryAbility",
"querySchemes": ["amapuri"] // 高德地图协议标识
}
]
2.检测高德地图安装状态
通过bundleManager
检测设备是否安装高德地图:
import bundleManager from '@ohos.bundle.bundleManager';
async checkAmapInstalled(): Promise<boolean> {
try {
return await bundleManager.canOpenLink('amapuri://');
} catch (err) {
console.error(`检测失败: ${err.code}, ${err.message}`);
return false;
}
}
二、构造导航URI参数
1.地址转经纬度
使用第三方库(如@pura/harmony-utils
)将文字地址转为高德地图支持的GCJ02坐标系坐标。我的上一个文章中有说明,用context传递坐标给高德。
2.URI参数说明
参数 | 必填 | 说明 |
---|---|---|
dlat & dlon | 是 | 目标地点经纬度(需GCJ02坐标系) |
dname | 否 | 目标名称(如“天安门”) |
dev | 是 | 坐标系类型:0 (已加密坐标)或1 (需国测加密) |
t | 是 | 导航类型:0 (驾车)、1 (公交)、2 (步行)、3 (骑行) |
三、拉起导航的核心内容
通过Want
对象构造URI并启动高德地图。
async startAmapNavigation() {
if (!await this.checkAmapInstalled()) {
promptAction.showToast({ message: "请先安装高德地图" });
return;
}
const context = getContext(this) as common.UIAbilityContext;
const want: Want = {
uri: `amapuri://navi?sourceApplication=MyApp&dlat=${latitude}&dlon=${longitude}&dname=天安门&dev=0&t=0`
};
context.startAbility(want, (err: BusinessError) => {
if (err.code) {
console.error(`导航失败: ${err.code}, ${err.message}`);
promptAction.showToast({ message: "启动导航失败,请重试" });
}
});
}
四、获取高德地图的key
入门指南-HarmonyOS NEXT 导航SDK | 高德地图API
以上为获取高德地图key的相关文档,有需要的可以去查看
1.搭建鸿蒙开发环境
开发鸿蒙应用需要使用鸿蒙的IDE进行开发,具体内容请参考 鸿蒙官网开发文档
-
开发环境配置完成后,请参考 创建和运行Hello World 创建工程。
2.配置应用的签名信息
应用工程创建完成后,需要配置签名信息,才可以使用真机调试和发布应用。具体的签名配置请参考 华为官网的配置应用签名信息指南
3.获取应用的appId
1. 配置应用签名信息
前提:需在DevEco Studio中完成应用签名配置(参考鸿蒙官方签名指南),否则无法获取有效AppId。
签名作用:确保应用唯一性,AppId包含签名哈希值,用于高德SDK鉴权。
2. 编写代码获取AppId
在应用启动时(如EntryAbility
的onCreate
或页面aboutToAppear
生命周期),通过bundleManager
接口获取签名信息:
配置完签名信息之后,就可以获取当前应用的appId了,这个appId主要用于申请高德的apiKey,请确定最终发布应用的appId, 防止最终高德SDK鉴权失败。
目前只能通过代码获取应用的appId,具体代码请参考如下代码
let flag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
let bundleInfo = bundleManager.getBundleInfoForSelfSync(flag)
let appId = bundleInfo.signatureInfo.appId;
最终获取的appId格式类似于:com.amap.demo_BGtGgVB3ASqU7ar1nHkwX4s0nIexDbEwqNrVoatUDs17GrClWC7V2/zhoYh6tFQHAd5DASWVTEAgvZfzrEGljjs=
注意:为了确保鉴权通过,请确保真机调试时使用的key是基于真机获取的appid申请的,而云真机调试时则应使用云真机appid对应的key
4.申请高德API Key
1.创建新应用
进入 控制台,创建一个新应用。如果您之前已经创建过应用,可直接跳过这个步骤。
在本段第三行有获取AppID的方法,点击提交获取key值
5.在代码中设置申请的Key
//申请地址:https://console.amap.com/dev/key/app,appId在日志中过滤即可获取
const appkey = '你申请的 Key'
this.naviInstance = AMapNaviFactory.getAMapNaviInstance(getContext().getApplicationContext(), appkey)
提示
请保证在调用任何高德导航SDK的接口之前将apikey设置给高德导航SDK,建议放到Application的初始化之中
五、注意事项
1.真机测试:需签名后的应用包才能调用第三方App
2.参数校验:经纬度范围需合法(纬度:-90~90,经度:-180~180)
3.用户体验:建议在按钮点击事件中触发导航,并添加加载提示