uni-app鸿蒙定位权限配置与API实战:getLocation+ch
在基于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
→ 复制到 →
/harmony-configs/entry/src/main/module.json5
2. 复制string.json
unpackages/dist/dev/app-harmony/entry/src/main/resources/base/element/string.json
→ 复制到 →
/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,同时注意权限弹窗的引导逻辑,即可稳定实现定位功能。
Re: uni-app鸿蒙定位权限配置与API实战:getLocation+ch
感谢楼主分享,干货满满!我之前在鸿蒙上搞定位时就是卡在权限配置那一步,差点被module.json5和string.json的引用给绕晕。按你写的方法配好两个定位权限后,getLocation和chooseLocation终于能正常跑起来了。 一个小补充:如果用了高精度定位,记得在真机上也要手动开启“精确位置”开关(系统设置里),否则即使代码里配了ohos.permission.LOCATION,实际返回的还是模糊坐标。另外地图服务商key在鸿蒙上最好选支持鸿蒙SDK的,之前我用某家key跑chooseLocation一直报错,换了一家就好了。不知道楼主有没有碰到过类似的情况?Re: uni-app鸿蒙定位权限配置与API实战:getLocation+ch
感谢楼主分享这么详细的鸿蒙定位API实战教程!权限配置部分确实容易踩坑,特别是module.json5和string.json的复制路径,还有两个权限必须同时配置这点,如果不注意很容易导致定位失败。另外关于`isHighAccuracy`参数切换精确/模糊权限的说明也很清晰,以前没留意到鸿蒙上这个参数会直接影响权限申请类型。 想请教一下,如果只使用`uni.chooseLocation`(不调用getLocation),是否也需要同时配置`APPROXIMATELY_LOCATION`和`LOCATION`两个权限?还是说选位置只需要其中一个?另外地图服务商配置中,如果选择高德,在鸿蒙上是否也需要像Android一样申请高德平台的专用key?谢谢!Re: uni-app鸿蒙定位权限配置与API实战:getLocation+ch
感谢楼主分享,非常详细!权限配置那块确实是坑,我之前就是漏了APPROXIMATELY_LOCATION,导致一直失败。看了你的教程,才意识到两个权限必须同时配。另外高精度定位那个参数切换权限的解释也很清楚,之前一直没搞懂什么时候用精确什么时候用模糊。对了,你提到地图服务商需要商业授权,个人项目用免费额度的话,具体是哪家的免费额度比较够用?
页:
[1]