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://www.pswp.cn/pingmian/97852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97852.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97852.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCGrad解決多任務沖突

論文解讀:"Gradient Surgery for Multi-Task Learning" 1. 論文標題直譯 Gradient Surgery: 梯度手術for Multi-Task Learning: 應用于多任務學習 合在一起就是:為多任務學習量身定制的梯度手術。這個名字非常形象地概括了它的核心思想。 …

Nvidia顯卡架構解析與cuda應用生態淺析

文章目錄 0. Nvidia顯卡簡介 一、主要顯卡系列 二、主要GPU架構與代表產品 1.main 1.1 CUDA 13.0 的重大變化 1.2 V100 的硬件短板已顯現 1.3 這意味著什么? 1.4 寫在后面 彩蛋:V100 0. Nvidia顯卡簡介 一、主要顯卡系列 GeForce 系列(消費級) 用途:游戲、創作、日常圖形…

開發指南:使用 MQTTNet 庫構建 .Net 物聯網 MQTT 應用程序

一、背景介紹 隨著物聯網的興起,.Net 框架在構建物聯網應用程序方面變得越來越流行。微軟的 .Net Core 和 .Net 框架為開發人員提供了一組工具和庫,以構建可以在 Raspberry Pi、HummingBoard、BeagleBoard、Pine A64 等平臺上運行的物聯網應用程序。 MQT…

突破性能瓶頸:基于騰訊云EdgeOne的AI圖片生成器全球加速實踐

1. 項目背景與挑戰 1.1 開發背景 隨著AIGC技術爆發,我們團隊決定開發一款多模型支持的AI圖片生成器,主要解決以下痛點: 不同AI模型的參數規范不統一生成結果難以系統化管理缺乏企業級的安全水印方案全球用戶訪問延遲高,中國用戶…

一、Java 基礎入門:從 0 到 1 認識 Java(詳細筆記)

1.1 Java 語言簡介與發展歷程 Java 是一門面向對象的高級編程語言,以“跨平臺、安全、穩定”為核心特性,自誕生以來長期占據編程語言排行榜前列,廣泛應用于后端開發、移動端開發、大數據等領域。 1.1.1 起源與核心人物 起源背景&#xff1…

uniapp:根據目的地經緯度,名稱,喚起高德/百度地圖來導航,兼容App,H5,小程序

1、需要自行申請高德地圖的key,配置manifest.json 2、MapSelector選擇組件封裝 <template><view><u-action-sheet :list="mapList" v-model="show" @click="changeMap"></u-action-sheet></view> </template&…

我對 WPF 動搖時的選擇:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi

目錄 NET Framework 4.6.2的最大亮點 為什么固守462不升級 WPF-開發體驗的巔峰 為什么對WPF動搖了 基于IslandsUWP的濾鏡嘗試 總結 NET Framework 4.6.2的最大亮點 安全性能大提升&#xff1a; 默認啟用TLS1.2協議&#xff0c;更安全&#xff0c;它為后續的版本提供了重…

SpringBoot大文件下載失敗解決方案

SpringBoot大文件下載失敗解決方案 后端以文件流方式給前端接收下載文件,文件過大時出現下載失敗的情況或者打開后提示文件損壞,實際是字節未完全讀取寫入。 針對大文件下載失敗的情況,以下是詳細的解決方案: 大文件下載失敗的主要原因 內存溢出:一次性加載大文件到內存…

torch.gather

torch.gather 介紹 torch.gather(input, dim, index, *, sparse_gradFalse, outNone) → Tensor 沿由 dim 指定的軸收集值。 對于三維張量&#xff0c;輸出按如下方式確定&#xff1a; out[i][j][k] input[index[i][j][k]][j][k] # 如果 dim 0 out[i][j][k] input[i][i…

Golang | http/server Gin框架簡述

http/server http指的是Golang中的net/http包&#xff0c;這里用的是1.23.10。 概覽 http包的作用文檔里寫的很簡明&#xff1a;Package http provides HTTP client and server implementations. 主要是提供http的客戶端和服務端&#xff0c;也就是能作為客戶端發http請求&a…

Vision Transformer (ViT) :Transformer在computer vision領域的應用(三)

Experiment 上來的一段話就概括了整章的內容。 We evaluate the representation learning capabilities of ResNet, Vision Transformer (ViT), and the hybrid. 章節的一開頭就說明了,對比的模型就是 ResNet,CNN領域中的代碼模型。 ViT。 上一篇中提到的Hybrid模型,也就是…

5-12 WPS JS宏 Range數組規范性測試

Range()數組是JS宏中不缺少的組成部分,了解Range()數組的特性必不可少,下面我們一起測試一下各種Range()數組。 1.Range()數組特性 單元格區域:Range("a2:m2")與Range("a2","m2")的類型都是:Range/Object,功能都為單元格區域,功能…

uniapp微信小程序保存海報到手機相冊canvas

在uniapp中實現微信小程序保存海報到手機相冊&#xff0c;主要涉及Canvas繪制和圖片保存。以下是關鍵步驟和代碼示例&#xff1a; 一、關鍵代碼展示&#xff1a; 1. 模板配置&#xff1a;頁面展示該海報&#xff0c;可直接查看&#xff0c;也可下載保存到手機相冊&#xff0c;h…

glib2-2.62.5-7.ky10.x86_64.rpm怎么安裝?Kylin Linux RPM包安裝詳細步驟

一、準備工作 ?確認系統版本? 這個包是 ky10的&#xff08;也就是 openEuler 20.03 LTS SP3 或類似版本&#xff09;&#xff0c;而且是 ?x86_64 架構&#xff08;就是常見的64位電腦&#xff09;?。 你要先確認你的系統是不是這個版本&#xff0c;不然可能裝不上或者出問題…

webrtc之語音活動下——VAD人聲判定原理以及源碼詳解

文章目錄前言一、高斯混合模型介紹1.高斯模型舉例1&#xff09;定義2&#xff09;舉例說明2.高斯混合模型(GMM)1&#xff09;定義2&#xff09;舉例說明3&#xff09;一維曲線二、VAD高斯混合模型1.模型訓練介紹1&#xff09;訓練方法2&#xff09;訓練結果2.噪聲高斯模型分布1…

【Redis】-- 主從復制

文章目錄1. 主從復制1.1 主從復制是怎么個事&#x1f914;1.2 拓撲結構1.2.1 一主一從拓撲1.2.2 一主多從拓撲1.2.3 樹形拓撲1.3 主從復制原理1.3.1 復制過程1.3.2 數據同步PSYNC1.3.2.1 replicationid/replid (復制id)1.3.2.2 復制偏移量維護1.3.3 psync運行流程1.3.4 全量復制…

開源炸場!阿里通義千問Qwen3-Next發布:80B參數僅激活3B,訓練成本降90%,長文本吞吐提升10倍?

開源炸場&#xff01;阿里通義千問Qwen3-Next發布&#xff1a;80B參數僅激活3B&#xff0c;訓練成本降90%&#xff0c;長文本吞吐提升10倍? 開源世界迎來震撼突破&#xff01; 通義千問團隊最新發布的Qwen3-Next架構&#xff0c;以其獨創的"小而精"設計理念&#x…

【C++入門】C++基礎

目錄 1. 命名空間 1.1 命名空間的創建和使用 2. 輸入輸出 2.1 輸出 2.2 輸入 3. 缺省參數 3.1 全缺省 3.2 半缺省 4.函數重載 4.1 為什么C支持重載而C語言不支持&#xff1f; 4.1.2 編譯的四個過程 4.2 extern是什么 5.引用 5.1 引用的特性 5.1.1 引用的“隱式類…

如何往mp4視頻添加封面圖和獲取封面圖?

前言&#xff1a;大家好&#xff0c;之前有給大家分享過mp4錄像的方案&#xff0c;今天給大家分享的內容是&#xff1a;如何在添加自定義的封面圖到mp4里面去&#xff0c;以及在進入回放mp4視頻列表的時候&#xff0c;怎么獲取mp4視頻里面的封面圖&#xff0c;當然這個獲取到的…

你的第一個Transformer模型:從零實現并訓練一個迷你ChatBot

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;破除神秘感&#xff0c;擁抱核心思想 …