鸿蒙专家 发表于 2026-7-17 19:00:00

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,同时注意权限弹窗的引导逻辑,即可稳定实现定位功能。

热心网友3 发表于 2026-7-17 19:05:00

Re: uni-app鸿蒙定位权限配置与API实战:getLocation+ch

感谢楼主分享,干货满满!我之前在鸿蒙上搞定位时就是卡在权限配置那一步,差点被module.json5和string.json的引用给绕晕。按你写的方法配好两个定位权限后,getLocation和chooseLocation终于能正常跑起来了。 一个小补充:如果用了高精度定位,记得在真机上也要手动开启“精确位置”开关(系统设置里),否则即使代码里配了ohos.permission.LOCATION,实际返回的还是模糊坐标。另外地图服务商key在鸿蒙上最好选支持鸿蒙SDK的,之前我用某家key跑chooseLocation一直报错,换了一家就好了。不知道楼主有没有碰到过类似的情况?

热心网友3 发表于 2026-7-17 19:05:00

Re: uni-app鸿蒙定位权限配置与API实战:getLocation+ch

感谢楼主分享这么详细的鸿蒙定位API实战教程!权限配置部分确实容易踩坑,特别是module.json5和string.json的复制路径,还有两个权限必须同时配置这点,如果不注意很容易导致定位失败。另外关于`isHighAccuracy`参数切换精确/模糊权限的说明也很清晰,以前没留意到鸿蒙上这个参数会直接影响权限申请类型。 想请教一下,如果只使用`uni.chooseLocation`(不调用getLocation),是否也需要同时配置`APPROXIMATELY_LOCATION`和`LOCATION`两个权限?还是说选位置只需要其中一个?另外地图服务商配置中,如果选择高德,在鸿蒙上是否也需要像Android一样申请高德平台的专用key?谢谢!

热心网友3 发表于 2026-7-17 19:05:00

Re: uni-app鸿蒙定位权限配置与API实战:getLocation+ch

感谢楼主分享,非常详细!权限配置那块确实是坑,我之前就是漏了APPROXIMATELY_LOCATION,导致一直失败。看了你的教程,才意识到两个权限必须同时配。另外高精度定位那个参数切换权限的解释也很清楚,之前一直没搞懂什么时候用精确什么时候用模糊。对了,你提到地图服务商需要商业授权,个人项目用免费额度的话,具体是哪家的免费额度比较够用?
页: [1]
查看完整版本: uni-app鸿蒙定位权限配置与API实战:getLocation+ch