Android拦截跳转地图导航,Android开发的 app 通过跳转到百度、高德、腾讯进行导航...

本文记录了在Android项目中如何实现通过代码跳转到百度、高德、腾讯地图进行步行导航的功能。详细提供了获取GPS坐标并启动相应地图App的Intent代码示例,方便开发者快速集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中遇到的一个需求,跳转外部App进行步行导航。分别是百度、高德、腾讯。

东西不难但是每次都要去官方文档找(有时候会更新一些字段)。

所以在此做下记录和分享。

百度地图

// 获取gps定位坐标值

double[] bdGPS = myLocation.getLocPoint();

Intent bdNav = new Intent();

// 步行导航

bdNav.setData(Uri.parse("baidumap://map/walknavi?origin="+bdGPS[0]+","+bdGPS[1]+"&destination=43.81710,125.38332&coord_type=bd09ll&src=andr.baidu.openAPIdemo"));

// 骑行导航

//bdNav.setData(Uri.parse("baidumap://map/bikenavi?origin="+bdGPS[0]+","+bdGPS[1]+"&destination=43.81710,125.38332&coord_type=bd09ll&src=andr.baidu.openAPIdemo"));

// 驾车导航

//bdNav.setData(Uri.parse("baidumap://map/navi?query=解放大路与人民大街交汇&src=andr.baidu.openAPIdemo"));

startActivity(bdNav);

高德地图

// 获取gps定位坐标值

double[] gdGPS = myLocation.getLocPoint();

// 终点的显示名称 必要参数

String gbNavName = "终点";

Uri gdUri = Uri.parse("amapuri://route/plan/?dlat="+gdGPS[0]+"&dlon="+gdGPS[1]+"&dname="+gbNavName+"&dev=0&t=2");

Intent gdNav =new Intent("android.intent.action.VIEW", gdUri);

gdNav.addCategory("android.intent.category.DEFAULT");

startActivity(gdNav);

腾讯地图

// 终点的经纬度坐标值

double[] txGPS = new double[]{43.81710,125.38332};

//终点的显示名称 必要参数

String txNavName = "终点";

Uri txUri = Uri.parse("qqmap://map/routeplan?type=walk" +

"&to=" +txNavName

+"&tocoord=" + txGPS[0] +"," + txGPS[1]

+"&referer=呼唤");

Intent txNav =new Intent();

txNav.setData(txUri);

startActivity(txNav);

标签:app,Uri,bdGPS,parse,Intent,跳转,bdNav,Android,高德

来源: https://blog.csdn.net/qq_19688207/article/details/112219651

<think>我们是在UniApp开发H5页面,需要实现点击输入框时调用地图组件(比如腾讯地图高德地图的API)进行地址选择,然后将选择的地址返回到输入框中。 由于UniApp是一个跨平台框架,我们可以使用H5环境下的地图服务。这里我们以高德地图为例,因为高德地图提供了比较方便的H5选址组件。 步骤: 1. 在输入框上绑定点击事件,点击时调用地图选址组件。 2. 引入高德地图JS API,使用高德地图的POI搜索和选址功能。 3. 用户选择地址后,将地址信息回填到输入框中。 注意:使用高德地图API需要申请key,并在项目中引入。 实现: - 在index.html中引入高德地图JS API(注意:替换成你的key) - 在页面中,当点击输入框时,调用高德地图的选址组件(这里使用高德地图的POI搜索插件,或者直接使用高德地图的移动端选址组件) 由于高德地图的H5选址组件有多种方式,这里我们采用一种简单的方式:使用高德地图的PlaceSearch插件,并结合自定义的弹窗展示。 但是,高德地图官方推荐H5端使用移动端选址组件:https://lbs.amap.com/api/javascript-api/guide/services/autocomplete 这里我们使用地点搜索(Autocomplete)和POI选择。 然而,更直接的方式是使用高德地图的H5定位选择组件:https://lbs.amap.com/api/javascript-api/guide/services/geolocation 但注意,这个主要是定位,不是选点。 实际上,我们可以打开一个新的页面,使用高德地图的移动端页面进行选点,然后回传数据。但是H5中更常见的是使用弹窗形式。 高德地图提供了AMap.PlaceSearch插件,可以搜索地点并展示,但需要自己构建界面。为了快速实现,我们可以使用高德地图的输入提示与POI选择功能(AMap.Autocomplete)结合,但这样用户需要输入。 另一种方案:使用高德地图的H5选择器,它提供了一个独立的页面,我们可以通过URL打开,然后回跳。但是需要配置返回地址。这种方式在微信中可能会被拦截,所以不太推荐。 这里我们采用一种更直接的方式:使用AMap.Autocomplete和AMap.PlaceSearch结合,在点击输入框时,显示一个搜索框和结果列表,用户选择后填充。 但是,题目要求是点击输入框调用地图组件,确保精准定位,并且选择地址。所以我们需要先获取用户当前位置,然后展示附近的地点,并允许用户搜索选择。 高德地图提供了AMap.Geolocation获取当前位置,然后结合AMap.PlaceSearch进行附近搜索。 由于在UniApp的H5环境中,我们可以直接使用高德的JS API,所以我们可以这样实现: 步骤: 1. 在index.html的head中引入高德地图JS API(注意:使用你的key) 2. 在页面中,当点击输入框时,创建一个遮罩层,并在遮罩层中显示地图容器和一个搜索框。 3. 初始化地图,并定位到当前位置,然后展示附近的POI点。 4. 用户点击地图上的点,或者从搜索列表中选择一个点,然后关闭遮罩层,并将地址信息回填到输入框中。 但是,这个实现相对复杂,需要自己构建UI。 为了简化,我们可以使用高德地图的移动端选址组件(它提供了一个完整的界面),但是需要跳转高德地图的H5页面,然后回调到我们的页面。这种方式需要配置回调地址,并且需要后端支持(因为回调地址必须是可访问的,且需要处理参数)。在纯前端,我们可以使用URL参数传递,但这样地址信息会暴露在URL中,而且需要页面跳转。 考虑到用户体验,我们选择在页面内弹窗的方式。 这里我们采用一个折中的方案:使用高德地图的Autocomplete插件,构建一个搜索下拉框,同时结合定位,让用户输入的同时可以搜索附近,然后选择。 但是,题目要求是调用地图组件,所以我们需要展示地图,让用户在地图上选点。 因此,我们决定这样做: 1. 点击输入框,弹出一个全屏的遮罩层,遮罩层内有一个地图容器和一个搜索框。 2. 初始化地图,定位到用户当前位置,并在地图上显示标记。 3. 用户可以通过拖动地图改变位置,也可以使用搜索框搜索地点。 4. 用户确定位置后(比如点击确定按钮),将选中的地址信息回填到输入框。 具体步骤: 1. 引入高德地图JS API(在index.html中引入) 2. 在页面中,创建遮罩层(使用v-if控制显示),遮罩层包含一个地图容器(div)和一个搜索框,以及一个确定按钮。 3. 在点击输入框时,显示遮罩层,并初始化地图和搜索插件。 4. 初始化地图时,使用AMap.Geolocation获取当前位置,并设置地图中心点。 5. 添加地图点击事件,当用户点击地图时,获取该点的经纬度,然后通过逆地理编码获取地址信息,并显示一个标记。 6. 同时,初始化Autocomplete,用于搜索地点,当搜索地点被选择时,将地图中心移动到该点,并同样显示标记。 7. 用户点击确定按钮,将当前选中的地址信息填入输入框,并关闭遮罩层。 由于代码较长,我们将分步骤实现。 注意:在UniApp中,H5页面是运行在浏览器环境,所以可以使用window.AMap等全局对象。 实现代码: 首先,在index.html中引入高德地图JS API(注意:替换your_key): ```html <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的key&plugin=AMap.Geolocation,AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder"></script> ``` 然后,在页面的vue文件中,我们实现如下: 由于在UniApp中,我们使用vue语法。这里假设我们的页面中有一个输入框,点击后弹出地图组件。 注意:由于地图容器需要指定宽高,我们在遮罩层内设置一个全屏的地图容器。 代码示例:</think>以下是在 UniApp H5 页面中实现点击输入框调用地图组件并回填地址的完整解决方案: ### 解决方案思路 1. **使用高德地图 H5 选址组件**(官方推荐方案) 2. **通过遮罩层实现原生地图体验** 3. **精确定位 + 地址搜索双功能** 4. **选择后数据回填到输入框** ### 完整代码实现 ```html <template> <view class="container"> <!-- 地址输入框 --> <input v-model="address" placeholder="点击选择地址" @click="openMapSelector" class="address-input" /> <!-- 地图组件遮罩层 --> <view v-if="showMap" class="map-mask"> <view class="map-container"> <!-- 高德地图H5选址组件 --> <iframe :src="mapUrl" class="map-iframe" frameborder="0" ></iframe> <!-- 操作按钮 --> <view class="map-controls"> <button @click="confirmAddress" class="confirm-btn">确认选择</button> <button @click="closeMap" class="cancel-btn">取消</button> </view> </view> </view> </view> </template> <script> export default { data() { return { address: "", // 存储选择的地址 showMap: false, // 控制地图显示 selectedLocation: null, // 存储选择的位置信息 // 高德H5选址组件URL(需替换为你的key) mapUrl: "https://uri.amap.com/marker?position=116.473195,39.993253&callnative=0&src=yourAppName" }; }, methods: { // 打开地图选择器 openMapSelector() { // 先获取当前位置提升体验 this.getCurrentPosition().then(pos => { const [lng, lat] = pos; this.mapUrl = `https://uri.amap.com/marker?position=${lng},${lat}&callnative=0&src=yourAppName`; this.showMap = true; }).catch(() => { // 获取位置失败使用默认位置 this.showMap = true; }); }, // 获取当前位置 getCurrentPosition() { return new Promise((resolve, reject) => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( position => { resolve([position.coords.longitude, position.coords.latitude]); }, error => { console.error("定位失败:", error); reject(); }, { enableHighAccuracy: true, // 高精度模式 timeout: 5000, maximumAge: 0 } ); } else { reject("浏览器不支持定位"); } }); }, // 确认选择地址 confirmAddress() { // 监听message事件获取地图回调数据 window.addEventListener('message', this.handleMapMessage); // 向iframe发送消息获取选择的位置 const iframe = document.querySelector('.map-iframe'); if (iframe && iframe.contentWindow) { iframe.contentWindow.postMessage('getLocation', '*'); } }, // 处理地图返回的数据 handleMapMessage(event) { // 确保来源安全 if (event.origin !== 'https://uri.amap.com') return; if (event.data && event.data.location) { this.selectedLocation = event.data; this.address = this.formatAddress(event.data); } // 清理监听 window.removeEventListener('message', this.handleMapMessage); this.closeMap(); }, // 格式化地址 formatAddress(location) { const { address, name, district } = location; return `${district}${address}${name}`; }, // 关闭地图 closeMap() { this.showMap = false; } } }; </script> <style scoped> .container { padding: 20px; } .address-input { width: 100%; height: 40px; border: 1px solid #ddd; padding: 0 10px; border-radius: 4px; } .map-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 100; display: flex; align-items: center; justify-content: center; } .map-container { width: 90%; height: 80%; background: white; border-radius: 10px; overflow: hidden; display: flex; flex-direction: column; } .map-iframe { flex: 1; width: 100%; border: none; } .map-controls { padding: 10px; display: flex; justify-content: space-around; background: #f5f5f5; } .confirm-btn { background-color: #007AFF; color: white; } .cancel-btn { background-color: #eee; } </style> ``` ### 代码解释 1. **核心组件** - `<iframe>` 嵌入高德官方 H5 选址组件 - `map-mask` 遮罩层实现原生应用体验 - `postMessage` 实现跨域通信获取选择结果 2. **精准定位实现** ```javascript navigator.geolocation.getCurrentPosition( position => { resolve([position.coords.longitude, position.coords.latitude]); }, null, { enableHighAccuracy: true } // 关键参数 ); ``` - `enableHighAccuracy: true` 启用 GPS 级定位 - `timeout: 5000` 防止长时间等待 3. **地址选择流程** ```mermaid sequenceDiagram 用户->>输入框: 点击 输入框->>UniApp: 触发openMapSelector UniApp->>浏览器: 请求当前位置 浏览器-->>UniApp: 返回坐标 UniApp->>高德地图: 构建带坐标的URL 高德地图-->>用户: 显示地图界面 用户->>高德地图: 选择位置 UniApp->>高德地图: 发送getLocation消息 高德地图-->>UniApp: 返回位置数据(通过postMessage) UniApp->>输入框: 填充格式化地址 ``` 4. **关键优化点** - **定位前请求权限**:在 `openMapSelector` 中先获取位置权限 - **地址格式化**:`formatAddress` 方法组合省市区和详细地址 - **安全验证**:检查 `event.origin` 防止恶意数据 - **超时处理**:定位请求设置超时时间 ### 注意事项 1. **高德地图Key申请** - 前往[高德开放平台](https://lbs.amap.com/)注册账号 - 创建应用获取 Web 端 Key - 替换代码中的 `yourAppName` 和 Key 2. **跨域通信配置** ```javascript // 在页面初始化时添加全局监听 mounted() { window.addEventListener('message', this.handleMapMessage); }, beforeDestroy() { window.removeEventListener('message', this.handleMapMessage); } ``` 3. **精准定位优化** - 安卓设备可能需要 HTTPS 协议 - iOS 需在 manifest.json 添加定位描述 ```json "h5": { "geolocation": { "enableHighAccuracy": true } } ``` 4. **性能优化** - 使用 `v-if` 替代 `v-show` 控制地图组件 - 组件销毁时移除事件监听 - 防抖处理频繁定位请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值