在基于uni-app开发鸿蒙应用时,定位和地图选点是最常见的基础能力之一。uni-app提供了两个核心API——uni.getLocation(获取当前坐标)和uni.chooseLocation(打开地图让用户选择位置),它们在鸿蒙NEXT 5.0上均可正常使用,但需要完成一系列关键的权限配置,否则API调用会直接失败。本文从权限配置开始,梳理完整的调用流程与踩坑经验。
一、uni.getLocation:获取当前位置
最简单的GPS坐标获取方式如下:- uni.getLocation({
- type: 'wgs84',
- success: function (res) {
- console.log('经度:' + res.longitude);
- console.log('纬度:' + res.latitude);
- console.log('精度:' + res.accuracy);
- },
- fail: function (err) {
- console.error('定位失败:' + JSON.stringify(err));
- }
- });
复制代码
type参数可选wgs84(国际标准GPS坐标)或gcj02(国测局坐标,适用于map组件和uni.openLocation)。返回信息包含经纬度、精度等。
如果需要更高精度,可启用isHighAccuracy参数:- uni.getLocation({
- type: 'gcj02',
- isHighAccuracy: true,
- highAccuracyExpireTime: 5000, // 超时时间,单位ms
- success: function (res) {
- console.log('高精度定位结果:', res.latitude, res.longitude);
- }
- });
复制代码
当isHighAccuracy为true时,鸿蒙会申请精确位置权限(ohos.permission.LOCATION),否则仅申请模糊位置权限(ohos.permission.APPROXIMATELY_LOCATION)。
二、uni.chooseLocation:打开地图选位置
用于让用户在地图上选取地点(如填写收货地址),返回坐标格式为gcj02:- uni.chooseLocation({
- success: function (res) {
- console.log('位置名称:' + res.name);
- console.log('详细地址:' + res.address);
- console.log('纬度:' + res.latitude);
- console.log('经度:' + res.longitude);
- }
- });
复制代码
三、鸿蒙定位权限配置(最容易踩坑的部分)
不配好权限,定位API完全无法使用。需要按照以下步骤操作:
1. 复制module.json5
从HBuilderX产物目录复制:- unpackages/dist/dev/app-harmony/entry/src/main/module.json5
- → 复制到 →
- [HBuilderX工程目录]/harmony-configs/entry/src/main/module.json5
复制代码
2. 复制string.json- unpackages/dist/dev/app-harmony/entry/src/main/resources/base/element/string.json
- → 复制到 →
- [HBuilderX工程目录]/harmony-configs/entry/src/main/resources/base/element/string.json
复制代码
3. 添加定位权限
在module.json5的requestPermissions中追加:- {
- "name": "ohos.permission.APPROXIMATELY_LOCATION",
- "reason": "$string:location_reason",
- "usedScene": {
- "when": "inuse"
- }
- },
- {
- "name": "ohos.permission.LOCATION",
- "reason": "$string:location_reason",
- "usedScene": {
- "when": "inuse"
- }
- }
复制代码
两个权限必须同时存在,缺一不可。APPROXIMATELY_LOCATION是模糊定位,LOCATION是精确位置,通过isHighAccuracy参数切换。
4. 配置权限说明文案
编辑string.json,添加定位用途说明:- {
- "name": "location_reason",
- "value": "用于为您推荐附近的商家和服务"
- }
复制代码
注意:module.json5中reason字段必须用$string:引用string.json中的key,不能直接写中文,否则编译会报错。
四、地图服务商配置
uni.getLocation和uni.chooseLocation底层依赖地图服务商。鸿蒙平台需要在manifest.json中配置地图厂商的key:
manifest.json → App模块配置 → 定位(geolocation) → 选择服务商并填写key。
常用服务商:高德、百度、腾讯。三方定位和地图服务需要商业授权,费用约5万/年;个人项目或测试可用免费额度。
注意:鸿蒙上uni.chooseLocation依然使用manifest中配置的key,与Android/iOS不同(Android/iOS上地点搜索需通过uni-map-co云对象,因为安全网络限制)。
五、实际场景代码示例
场景一:获取当前位置并展示在地图上- uni.getLocation({
- type: 'gcj02',
- success: function (res) {
- this.latitude = res.latitude;
- this.longitude = res.longitude;
- }
- });
复制代码- <map
- :latitude="latitude"
- :longitude="longitude"
- :markers="[{latitude: latitude, longitude: longitude, title: '当前位置'}]"
- style="width: 100%; height: 300px;">
- </map>
复制代码
场景二:填写收货地址- uni.chooseLocation({
- success: function (res) {
- this.addressName = res.name;
- this.addressDetail = res.address;
- this.latitude = res.latitude;
- this.longitude = res.longitude;
- }
- });
复制代码
场景三:判断定位权限是否开启- uni.getSetting({
- success: function (res) {
- if (!res.authSetting['scope.userLocation']) {
- uni.showModal({
- title: '需要位置权限',
- content: '请开启位置权限以获取更好的服务',
- success: function (res) {
- if (res.confirm) {
- uni.openSetting();
- }
- }
- });
- }
- }
- });
复制代码
六、踩坑记录与注意事项
1. 模糊定位和精确定位必须同时申请
如果只申请APPROXIMATELY_LOCATION而不申请LOCATION,高精度定位不可用;反之上架审核会不通过。正确的做法是两个权限都声明,通过isHighAccuracy控制使用哪个。
2. 权限弹窗时机与引导
鸿蒙的定位权限弹窗仅在用户首次打开App时弹出一次。如果用户拒绝,需要通过uni.getSetting检查权限状态,再引导用户手动开启。
3. 鸿蒙4(非纯血)不支持系统定位
如果目标设备是鸿蒙4(非鸿蒙NEXT 5.0),需要配置三方定位SDK(如高德),并设置type: 'gcj02'。纯血鸿蒙5.0没有此问题。
4. 真机调试与正式打包
使用HBuilderX标准基座运行到真机,定位正常(基座内置DCloud的key)。但打包正式应用后,必须更换为manifest中自己配置的key,否则定位会失效。
5. 验证环境
uni-app 4.36+、HBuilderX 4.36+、DevEco Studio 5.0.3.400、HarmonyOS NEXT 5.0.0.29。
总结:在uni-app鸿蒙开发中,定位与地图选点功能的核心难点不在API调用本身,而在于权限配置的细节。严格按照上述步骤配置module.json5和string.json,同时注意权限弹窗的引导逻辑,即可稳定实现定位功能。 |