当前位置: 首页 > news >正文

HarmonyOS应用拉起系列(三):如何直接拉起腾讯/百度/高德地图进行导航

在鸿蒙应用开发中,经常需要跳转第三方地图应用(如 腾讯地图、百度地图、高德地图)进行导航。无论是出行类 App、物流类 App,还是线下活动类应用,都存在“跳转地图导航”的实际需求。写完HarmonyOS应用拉起系列一和二后在鸿蒙开发者社区以及各类技术问答平台上很多开发者都在询问:如何实现直接拉起导航应用。本文结合拉起系列一和实战代码,讲解如何封装 MapNavigator 工具类,实现:

  • 判断地图应用是否安装
    通过 scheme 检查(如 qqmap://baidumap://amapuri://),在拉起地图前先判断 App 是否存在,避免跳转失败。需要注意,这些 scheme 必须在 module.json5querySchemes 字段中声明,否则 canOpenLink 会返回错误或不准确的结果。
  • 拉起导航(startAbility 与 openLink 两种方式)
    • startAbilityByWant:通过构建 Want 对象携带导航参数,包括起点名称、起点经纬度、终点名称、终点经纬度、导航模式(驾车、步行、公交等)等,精确传递给第三方地图 App。
    • openLink:通过 URL scheme 拼接导航参数,直接拉起地图应用进行导航,同样支持传递起终点坐标、路线偏好等信息。
  • 未安装提示逻辑
    如果检测到地图 App 未安装,统一调用提示方法(如 promptAction.showToast)告知用户“腾讯地图/百度地图/高德地图未安装”,同时可扩展为引导用户前往应用市场下载。
  • querySchemes 配置的重要性
    只有在 module.json5 中声明了对应的 scheme,鸿蒙系统才能正确识别并允许通过 canOpenLink 或 openLink 拉起第三方 App,否则即便 App 已安装,也会出现“暂无打开方式”的提示。

通过封装,开发者只需调用相应方法并传入 起点、终点名称与经纬度,就能轻松实现多地图导航功能,避免重复实现安装判断、参数拼接和异常处理逻辑。

一、前提:querySchemes 配置

在鸿蒙中,判断应用是否安装通常依赖 bundleManager.canOpenLink(scheme)必须在自己应用的 module.json5 中配置对应的 scheme,否则即使应用安装了,也可能返回 false。

示例配置:

"module": {"querySchemes": ["qqmap","baidumap","amapuri"]
}
  • 这里的 qqmap, baidumap, amapuri 对应三方地图的 scheme。
  • 仅被拉起的应用需要配置自己的 URI;自己的应用只需配置 querySchemes

配置错误是 canOpenLink 返回 false 的常见原因。

二、工具类设计思路

封装思路:

  1. 定义 包名scheme
export enum MapApp {TENCENT = 'com.tencent.mapohos',BAIDU = 'com.baidu.hmmap',AMAP = 'com.amap.hmapp'
}export enum MapScheme {TENCENT = 'qqmap://',BAIDU = 'baidumap://',AMAP = 'amapuri://'
}
  1. 提供两类拉起方式:
  • startAbility 方式:可以传递完整参数,并可用于鸿蒙应用或元服务。
  • openLink 方式:类似 URI Scheme 方式,调用简单,直接拉起第三方应用。
  1. 判断安装,未安装统一提示。

三、方法拆解讲解

1. 判断应用是否安装

private isMapInstalled(scheme: string): boolean {try {return bundleManager.canOpenLink(scheme);} catch (err) {console.error(`canOpenLink failed for ${scheme}`, JSON.stringify(err));return false;}
}
  • 原理:通过 scheme 查询应用是否能被打开。
  • 注意:必须在 querySchemes 中声明,否则返回 false。
  • 示例
if (!this.isMapInstalled(MapScheme.TENCENT)) {this.showNotInstalledMsg('腾讯地图');
}

2. startAbility 方式拉起导航

async openTencentMapByWant(from: string, fromLat: number, fromLng: number,to: string, toLat: number, toLng: number) {if (!this.isMapInstalled(MapScheme.TENCENT)) {this.showNotInstalledMsg('腾讯地图');return;}const want: Want = {action: 'ohos.want.action.viewData',uri: `qqmap://map/routeplan?type=drive` +`&from=${from}&fromcoord=${fromLat},${fromLng}` +`&to=${to}&tocoord=${toLat},${toLng}` +`&policy=0&referer=myApp`};this.openMethod.startAbilityByWant(want);
}
  • 适用场景:希望完整控制参数、或者拉起鸿蒙应用/元服务。
  • 优点:可捕获异常,便于处理未安装或其他错误。

注意:百度地图在鸿蒙上暂时不支持 canOpenLink 判断,可直接尝试拉起。

3.openLink 方式拉起导航

async openTencentMapByLink(from: string, fromLat: number, fromLng: number,to: string, toLat: number, toLng: number) {if (!this.isMapInstalled(MapScheme.TENCENT)) {this.showNotInstalledMsg('腾讯地图');return;}const url = `qqmap://map/routeplan?type=drive` +`&from=${from}&fromcoord=${fromLat},${fromLng}` +`&to=${to}&tocoord=${toLat},${toLng}` +`&policy=0&referer=myApp`;this.openMethod.openLink(url);
}
  • 适用场景:快速拉起第三方应用。
  • 优点:无需关心包名和 Ability 名称。
  • 注意:需要保证 scheme 配置正确,否则会出现“暂无打开方式”。

4.统一未安装提示

private showNotInstalledMsg(appName: string) {promptAction.showToast({ message: `${appName} 未安装` });
}
  • 思路:所有地图统一调用该方法提示。
  • 可进一步引导用户前往应用市场下载。

四、使用示例

        // 拉起腾讯地图导航Button('拉起腾讯地图-ByLink').onClick((event: ClickEvent) => {this.mapNavigator.openTencentMapByLink('我的位置', 39.908823, 116.397470, '天安门', 39.915156, 116.403694)})// 拉起百度地图导航Button('拉起百度地图-ByLink').onClick((event: ClickEvent) => {this.mapNavigator.openBaiduMapByLink('我的位置', 39.908823, 116.397470, '天安门', 39.915156, 116.403694)})// 拉起高德地图导航Button('拉起高德打车-ByLink').onClick((event: ClickEvent) => {this.mapNavigator.openAmapByLink('我的位置', 39.908823, 116.397470, '天安门', 39.915156, 116.403694)})// 拉起腾讯地图导航Button('拉起腾讯地图-ByWant').onClick((event: ClickEvent) => {this.mapNavigator.openTencentMapByWant('我的位置', 39.908823, 116.397470, '天安门', 39.915156, 116.403694)})// 拉起百度地图导航Button('拉起百度地图-ByWant').onClick((event: ClickEvent) => {this.mapNavigator.openBaiduMapByWant('我的位置', 39.908823, 116.397470, '天安门', 39.915156, 116.403694)})// 拉起高德地图导航Button('拉起高德打车-ByWant').onClick((event: ClickEvent) => {this.mapNavigator.openAmapByWant('我的位置', 39.908823, 116.397470, '天安门', 39.915156, 116.403694)})

五、总结与最佳实践

  1. querySchemes 配置至关重要,否则 canOpenLink 失效。
  2. startAbility 与 openLink 方法各有优势
    • startAbility :可传递参数,可拉起鸿蒙应用/元服务
    • openLink:轻量、简单,适合第三方应用
  3. 统一未安装提示,提升用户体验。
  4. 百度地图在鸿蒙上 安装检测存在限制,直接拉起即可,异常捕获处理即可。

通过这种封装方式,业务逻辑只需关注 起点、终点,不必关心每个地图应用的调用差异,极大提高了开发效率与可维护性,以上示例代码和封装逻辑已在 真机上 测试通过,如有异常或适配问题,欢迎大家在 Issues 中提出,我们将持续优化并补充更多地图应用和导航参数的支持。如果大家喜欢或者对这个系列感兴趣欢迎大家在评论区交流讨论。

望一键三连!

六、代码仓库

README.md · ZhangHuiXin/MapNavigatorDemo - Gitee.com


文章转载自:

http://e3GYX2dT.wfkbk.cn
http://W5B4fgMu.wfkbk.cn
http://x7CUjGha.wfkbk.cn
http://xhl5Ct3Y.wfkbk.cn
http://jlgYLBH6.wfkbk.cn
http://aEx9hFVM.wfkbk.cn
http://Lz2nJr4a.wfkbk.cn
http://Z3vixtDG.wfkbk.cn
http://8vpFSRGo.wfkbk.cn
http://sbBdog5W.wfkbk.cn
http://yoiHb5gh.wfkbk.cn
http://xgCJrxzh.wfkbk.cn
http://gG8xCoCZ.wfkbk.cn
http://sPFuwaDo.wfkbk.cn
http://FPSLekyj.wfkbk.cn
http://BPudpNbo.wfkbk.cn
http://WYUddb7Z.wfkbk.cn
http://OyVHQuUz.wfkbk.cn
http://wix0fvRQ.wfkbk.cn
http://FuSFDz6F.wfkbk.cn
http://PwTtGmm0.wfkbk.cn
http://7QAxjEOa.wfkbk.cn
http://dN20ZwX3.wfkbk.cn
http://xAEXlwE6.wfkbk.cn
http://fYguKpqK.wfkbk.cn
http://PqBJSq6q.wfkbk.cn
http://1aBSGIRI.wfkbk.cn
http://suPhadoz.wfkbk.cn
http://cMMQqa2H.wfkbk.cn
http://qfOTnHoY.wfkbk.cn
http://www.dtcms.com/a/387199.html

相关文章:

  • Redis的主从库与切片集群机制
  • 打工人日报#20250916
  • WASM逆向
  • 如何计算最大公约数和最小公倍数
  • 我们设计时间戳的更新时间的时候通常将字段类型设置为int或者bigint 这样能避免2038的问题吗
  • 超越“防被告”:2025跨境电商IPR战略赋能与品牌升值之道
  • Scrapy进阶:POST请求模拟登录实战与管道的使用
  • Zabbix 7.0 配置钉钉告警
  • 知识拓展-智能体和数字人
  • 飞牛NAS部署影视站MooncakeTV
  • yolov8 和OPENCV 自带的目标检测模型 对比
  • 课前练习题-20250916-复习题
  • 基于Transformer-卷积神经网络和度量元学习的高压断路器小样本机械故障诊断
  • 基于 Rust 的 IoT 平台基础功能设计(一)
  • vue+typescript+node的前端项目
  • catkin工程和CMakelist.txt的基本使用
  • 使用 MyCat 实现 MySQL 主从读写分离
  • Visual Studio 函数头显示引用个数
  • 【毕业设计选题】大数据技术专业毕业设计选题指南指南:python(2026 届)
  • 组播实验指导
  • Easylogger与RTT结合使用 Easylogger在FreeRTOS下实现异步输出
  • 【openFeign详细介绍】
  • 抖音私信评论互动消息通知监听自动获取,通过qq机器人转发到qq来通知
  • 19.删除链表的倒数第N个节点(双指针妙用)
  • MySQL笔记5
  • 从《Attention Is All You Need》深入理解Transformer
  • 你的第一个Transformer模型:从零实现并训练一个迷你ChatBot
  • JVM工具全景指南
  • 储能电站监控与能量管理系统(EMS)技术规范
  • 代码随想录刷题——栈和队列篇(三)