查看: 79|回复: 3

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

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在基于uni-app开发鸿蒙应用时,定位和地图选点是最常见的基础能力之一。uni-app提供了两个核心API——uni.getLocation(获取当前坐标)和uni.chooseLocation(打开地图让用户选择位置),它们在鸿蒙NEXT 5.0上均可正常使用,但需要完成一系列关键的权限配置,否则API调用会直接失败。本文从权限配置开始,梳理完整的调用流程与踩坑经验。

一、uni.getLocation:获取当前位置

最简单的GPS坐标获取方式如下:
  1. uni.getLocation({
  2.   type: 'wgs84',
  3.   success: function (res) {
  4.     console.log('经度:' + res.longitude);
  5.     console.log('纬度:' + res.latitude);
  6.     console.log('精度:' + res.accuracy);
  7.   },
  8.   fail: function (err) {
  9.     console.error('定位失败:' + JSON.stringify(err));
  10.   }
  11. });
复制代码

type参数可选wgs84(国际标准GPS坐标)或gcj02(国测局坐标,适用于map组件和uni.openLocation)。返回信息包含经纬度、精度等。

如果需要更高精度,可启用isHighAccuracy参数:
  1. uni.getLocation({
  2.   type: 'gcj02',
  3.   isHighAccuracy: true,
  4.   highAccuracyExpireTime: 5000,  // 超时时间,单位ms
  5.   success: function (res) {
  6.     console.log('高精度定位结果:', res.latitude, res.longitude);
  7.   }
  8. });
复制代码

当isHighAccuracy为true时,鸿蒙会申请精确位置权限(ohos.permission.LOCATION),否则仅申请模糊位置权限(ohos.permission.APPROXIMATELY_LOCATION)。

二、uni.chooseLocation:打开地图选位置

用于让用户在地图上选取地点(如填写收货地址),返回坐标格式为gcj02:
  1. uni.chooseLocation({
  2.   success: function (res) {
  3.     console.log('位置名称:' + res.name);
  4.     console.log('详细地址:' + res.address);
  5.     console.log('纬度:' + res.latitude);
  6.     console.log('经度:' + res.longitude);
  7.   }
  8. });
复制代码

三、鸿蒙定位权限配置(最容易踩坑的部分)

不配好权限,定位API完全无法使用。需要按照以下步骤操作:

1. 复制module.json5
从HBuilderX产物目录复制:
  1. unpackages/dist/dev/app-harmony/entry/src/main/module.json5
  2. → 复制到 →
  3. [HBuilderX工程目录]/harmony-configs/entry/src/main/module.json5
复制代码

2. 复制string.json
  1. unpackages/dist/dev/app-harmony/entry/src/main/resources/base/element/string.json
  2. → 复制到 →
  3. [HBuilderX工程目录]/harmony-configs/entry/src/main/resources/base/element/string.json
复制代码

3. 添加定位权限
在module.json5的requestPermissions中追加:
  1. {
  2.   "name": "ohos.permission.APPROXIMATELY_LOCATION",
  3.   "reason": "$string:location_reason",
  4.   "usedScene": {
  5.     "when": "inuse"
  6.   }
  7. },
  8. {
  9.   "name": "ohos.permission.LOCATION",
  10.   "reason": "$string:location_reason",
  11.   "usedScene": {
  12.     "when": "inuse"
  13.   }
  14. }
复制代码

两个权限必须同时存在,缺一不可。APPROXIMATELY_LOCATION是模糊定位,LOCATION是精确位置,通过isHighAccuracy参数切换。

4. 配置权限说明文案
编辑string.json,添加定位用途说明:
  1. {
  2.   "name": "location_reason",
  3.   "value": "用于为您推荐附近的商家和服务"
  4. }
复制代码

注意: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云对象,因为安全网络限制)。

五、实际场景代码示例

场景一:获取当前位置并展示在地图上
  1. uni.getLocation({
  2.   type: 'gcj02',
  3.   success: function (res) {
  4.     this.latitude = res.latitude;
  5.     this.longitude = res.longitude;
  6.   }
  7. });
复制代码
  1. <map
  2.   :latitude="latitude"
  3.   :longitude="longitude"
  4.   :markers="[{latitude: latitude, longitude: longitude, title: '当前位置'}]"
  5.   style="width: 100%; height: 300px;">
  6. </map>
复制代码

场景二:填写收货地址
  1. uni.chooseLocation({
  2.   success: function (res) {
  3.     this.addressName = res.name;
  4.     this.addressDetail = res.address;
  5.     this.latitude = res.latitude;
  6.     this.longitude = res.longitude;
  7.   }
  8. });
复制代码

场景三:判断定位权限是否开启
  1. uni.getSetting({
  2.   success: function (res) {
  3.     if (!res.authSetting['scope.userLocation']) {
  4.       uni.showModal({
  5.         title: '需要位置权限',
  6.         content: '请开启位置权限以获取更好的服务',
  7.         success: function (res) {
  8.           if (res.confirm) {
  9.             uni.openSetting();
  10.           }
  11.         }
  12.       });
  13.     }
  14.   }
  15. });
复制代码

六、踩坑记录与注意事项

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

使用道具 举报

发表于 1 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 1 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 1 小时前 | 显示全部楼层

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

感谢楼主分享,非常详细!权限配置那块确实是坑,我之前就是漏了APPROXIMATELY_LOCATION,导致一直失败。看了你的教程,才意识到两个权限必须同时配。另外高精度定位那个参数切换权限的解释也很清楚,之前一直没搞懂什么时候用精确什么时候用模糊。对了,你提到地图服务商需要商业授权,个人项目用免费额度的话,具体是哪家的免费额度比较够用?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-17 20:56 , Processed in 0.027981 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部