HarmonyOS 鸿蒙Next中精确位置和模糊位置的分界是什么?

HarmonyOS 鸿蒙Next中精确位置和模糊位置的分界是什么? 调用哪个方法可以获得模糊位置?

调用哪个方法可以获得精确位置?

如果仅获得了模糊定位的权限,却调用精确定位的方法,是否会报错?

9 回复

先解释一下区别吧,精确位置和模糊位置的核心分界在于定位精度,这直接对应不同的权限等级:

模糊位置:精度范围为公里级别,通常指精确到约5公里范围。对应的权限为ohos.permission.APPROXIMATELY_LOCATION,权限等级为normal级别。

精确位置:精度范围为米级别,可获取到设备的具体坐标。对应的权限为ohos.permission.LOCATION,权限等级为dangerous级别。

总结来说,分界是精度级别(公里 vs 米),系统通过授予不同的权限来控制应用可获取的位置精度。

然后说一下获取位置的方法

在ArkTS开发中,获取位置信息通常使用geoLocationManager模块的getCurrentLocation方法。同一个方法会根据应用已获得的权限返回相应精度的位置数据,而非通过调用不同的方法来实现。 例如,这样:

let requestInfo: geoLocationManager.LocationRequest = {
  'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
  'scenario': geoLocationManager.LocationRequestScenario.UNSET,
  'timeInterval': 1,
  'distanceInterval': 0,
  'maxAccuracy': 0
};
geoLocationManager.getCurrentLocation(requestInfo).then((result) => {
  console.info('当前位置: ' + JSON.stringify(result));
}).catch((error: BusinessError) => {
  console.error('获取当前位置错误: ' + JSON.stringify(error));
});

如果你的应用仅拥有模糊位置权限时,该方法返回的位置信息精度为公里级;当同时拥有精确位置权限时,则返回米级精度的位置。

最后说一下你关心的是否报错问题,这点也不算什么问题,在调用定位前,使用abilityAccessCtrl相关接口检查当前权限状态就好。

目前在API level ≥ 9的设备上:仅申请ohos.permission.LOCATION会失败,导致无法获取任何位置信息。若只拥有模糊位置权限,系统可能返回模糊位置或抛出权限错误

而在API level < 9的设备上:历史版本可能允许直接获取精确位置,但自API level 9起,鸿蒙强制实施了更严格的权限分级策略。

更多关于HarmonyOS 鸿蒙Next中精确位置和模糊位置的分界是什么?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这里有官方demo

https://gitcode.com/HarmonyOS_Samples/location-service

开发步骤

  1. 开发者可以在应用配置文件中声明所需要的权限并向用户申请授权,具体可参考向用户申请授权
  2. 当APP运行在前台,且访问设备位置信息时,申请位置权限的方式如下:
申请位置权限的方式 是否允许申请 申请成功后获取的位置的精确度
申请ohos.permission.APPROXIMATELY_LOCATION 获取到模糊位置,精确度为5公里。
同时申请ohos.permission.APPROXIMATELY_LOCATION和ohos.permission.LOCATION 获取到精准位置,精准度在米级别。

HarmonyOS NEXT 里的:

精确位置
模糊位置

本质区别其实是:


1、精确位置是什么

精确位置:

能拿到具体经纬度

例如:

39.908823
116.397470

误差通常:

几米~几十米

一般来自:

  • GPS
  • WiFi
  • 基站
  • 蓝牙

适用于:

  • 导航
  • 打车
  • 骑行
  • 外卖
  • 运动轨迹

对应权限:

ohos.permission.LOCATION

2、模糊位置是什么

模糊位置:

只能拿到大概区域

例如:

北京市朝阳区

或者:

误差几百米~几公里

系统会主动降精度。

适用于:

  • 天气
  • 内容推荐
  • 同城信息
  • 广告

对应权限:

ohos.permission.APPROXIMATELY_LOCATION

3、调用哪个API获得位置

实际上:

调用的方法是同一个

比如:

geoLocationManager.getCurrentLocation()

官方文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/location-guidelines


区别不在:

调用哪个方法

而在于:

用户授予了什么权限

4、如果只有模糊权限会怎样

例如:

你只申请:

ohos.permission.APPROXIMATELY_LOCATION

然后调用:

getCurrentLocation()

不会报错。

但是:

系统返回的会是降精度后的坐标

也就是:

模糊位置

5、不会因为调用“精确定位API”直接报错

HarmonyOS NEXT 这里不是:

两个不同API

而是:

同一个API
+
系统根据权限决定精度

6、什么时候会报错

真正会报错的是:

没有任何定位权限

例如:

LOCATION
APPROXIMATELY_LOCATION

都没申请。

这时候:

getCurrentLocation()

才可能:

  • 抛异常
  • 返回权限错误

7、推荐实践

如果你的业务:

不需要精准导航

建议:

优先申请:

APPROXIMATELY_LOCATION

更容易过审核。

只有:

  • 地图导航
  • 打车
  • 运动轨迹
  • 蓝牙围栏

这种场景:

才建议申请:

LOCATION

一句话总结:

HarmonyOS NEXT 的模糊定位和精确定位通常使用同一个定位API;
区别在于用户授予的权限不同。
只有模糊定位权限时,调用 getCurrentLocation() 不会报错,但系统返回的是降精度后的模糊坐标。

模糊位置: 对应的权限是ohos.permission.APPROXIMATELY_LOCATION,权限等级为normal级别。它允许应用获取设备的大致位置信息,精度范围通常在公里级别,例如精确到5公里。

精确位置: 对应的权限是ohos.permission.LOCATION,权限等级为dangerous级别。它允许应用获取设备的详细位置信息,精度范围在米级别。

如果应用仅获得了模糊定位权限调用了获取精确位置权限的操作,不会报错但是仅返回模糊位置。

在目前的开发看来是不会报错的,但是获取的位置是模糊位置。,

具体取决于你所用的版本。,

在HarmonyOS鸿蒙Next中,精确位置与模糊位置的分界以水平精度100米为阈值。当定位精度优于或等于100米时视为精确位置;精度低于100米(或仅能获取网络基站等粗粒度定位)则属于模糊位置。应用需在权限声明时区分使用场景,系统据此控制位置信息的详细程度。,

在HarmonyOS Next中,精确位置和模糊位置并不是通过调用不同的API方法来区分,而是由动态申请的权限级别和系统精度策略决定的,两者使用同一套位置请求接口。

  • 获得模糊位置:只需申请 ohos.permission.APPROXIMATELY_LOCATION 权限,并保持系统位置精度模式为“大致位置”(或未同时申请精确定位权限),调用 GeoLocationManager.getCurrentLocation 或开启位置更新时,系统返回的经纬度会被加扰,得到大约数公里范围的模糊位置。
  • 获得精确位置:需同时持有 ohos.permission.LOCATION 权限(若调用方声明了精确定位),且系统未处于仅允许大致位置模式,调用同样的接口,返回高精度结果。

如果仅获得模糊定位权限,却尝试以高精度参数(如设置 SingleLocationRequest 的精度为高精度)发起定位,不会直接抛出权限异常,但系统会忽略精度要求,实际返回模糊位置。若在权限检查严格的环境或API版本,可能因权限不足导致定位请求失败,返回错误码。

总之,API相同,区分全在权限与系统设置。

回到顶部