Flutter应用如何加入Google Maps链接打开选项并提取经纬度执行导航操作
Flutter实现监听Google Maps位置链接的完整方案
第一步:配置平台端的Deep Link监听规则
Android端配置
在android/app/src/main/AndroidManifest.xml文件的启动Activity标签内,添加如下intent-filter配置:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="google.com" android:pathPrefix="/maps" /> <data android:scheme="https" android:host="www.google.com" android:pathPrefix="/maps" /> </intent-filter>
配置完成后,所有以https://google.com/maps、https://www.google.com/maps开头的链接触发打开操作时,你的应用都会出现在系统可选打开列表中。
iOS端配置
- 登录苹果开发者后台,为你的应用ID开启
Associated Domains能力 - 打开Xcode中的Runner项目,进入
Signing & Capabilities标签,添加Associated Domains项,新增两个域名配置:applinks:google.comapplinks:www.google.com
第二步:正确实现uni_links监听逻辑
多数适配失败的核心原因是遗漏了冷启动场景的处理,按如下方式实现全场景监听:
在
pubspec.yaml中添加依赖:dependencies: uni_links: ^0.5.1执行
flutter pub get完成依赖安装。在应用首页的State中添加监听逻辑:
import 'package:flutter/material.dart'; import 'package:uni_links/uni_links.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override void initState() { super.initState(); // 处理冷启动场景:应用未启动时点击链接打开的情况 _handleColdStartLink(); // 处理热启动场景:应用后台运行时点击链接唤起的情况 _listenHotStartLink(); } Future<void> _handleColdStartLink() async { try { final initialLink = await getInitialLink(); if (initialLink != null) { _parseGoogleMapsLink(initialLink); } } catch (e) { // 自行处理异常即可 } } void _listenHotStartLink() { linkStream.listen((String? link) { if (link != null) { _parseGoogleMapsLink(link); } }, onError: (err) { // 自行处理流异常即可 }); } // 后续的解析、导航逻辑写在这里 }
第三步:解析Google Maps链接的经纬度参数
实现解析方法,从链接中提取坐标:
void _parseGoogleMapsLink(String link) { Uri uri = Uri.parse(link); // 提取q参数 String? qParam = uri.queryParameters['q']; if (qParam == null || !qParam.contains(',')) { // 无有效坐标参数的情况自行处理 return; } List<String> coords = qParam.split(','); if (coords.length != 2) return; try { double latitude = double.parse(coords[0].trim()); double longitude = double.parse(coords[1].trim()); // 拿到坐标后执行后续导航逻辑 _startNavigation(latitude, longitude); } catch (e) { // 坐标格式错误的情况自行处理 } // 如需适配其他格式的谷歌地图链接(如ll参数、placeId参数),可在这里扩展解析逻辑 }
第四步:实现导航逻辑
拿到经纬度后,可根据需求选择实现方式:
- 调用系统已安装的地图应用的跳转协议实现路线规划
- 应用内集成地图SDK(如高德地图、百度地图、Google Maps Flutter SDK)自行实现路线导航功能
常见适配失败排查点
- Android端需确认intent-filter配置在启动Activity标签内,不要放在application标签下
- iOS端需确认
Associated Domains已在开发者后台和Xcode中同时开启,域名配置无拼写错误 - 不要仅监听热启动的流回调,必须单独处理冷启动场景的初始链接获取
内容的提问来源于stack exchange,提问作者Mohamed Ghoneim
相关产品推荐
相关产品推荐

