HarmonyOS鸿蒙Next中应用需要使用精确位置和模糊位置,是否需要申请两次?显示两次弹窗?
HarmonyOS鸿蒙Next中应用需要使用精确位置和模糊位置,是否需要申请两次?显示两次弹窗? 是否申请了精确位置后,模糊位置不需要申请即可使用?
不是“申请了精确位置就自动拿到模糊位置”这么理解。API 9 及以后,定位权限建议按能力拆开看:
只申请 ohos.permission.APPROXIMATELY_LOCATION,用户授权后只能获取模糊位置;只申请 ohos.permission.LOCATION 通常不满足精确定位申请条件,可能授权失败或拿不到定位。
需要精确定位时,建议在 module.json5 同时声明 APPROXIMATELY_LOCATION 和 LOCATION,运行时也一次性把这两个权限传给 requestPermissionsFromUser。这样通常是一次系统授权流程,不是业务代码里强行弹两次。
回调里按 data.authResults[i] 对应 permissions[i] 判断。如果用户只给了模糊定位,就按模糊能力降级;只有两个都授权时,再走精确定位逻辑。
更多关于HarmonyOS鸿蒙Next中应用需要使用精确位置和模糊位置,是否需要申请两次?显示两次弹窗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
精确定位和模糊定位的调用方法分别是什么?如果仅获得模糊定位权限,代码里却调用精确定位方法,会不会报错?
参考《Location Kit》,有明确说明,也有《示例》。
如果两者都申请了。在授权时会有开关可选择。两种定位统一调用,不分接口。

let atManager = abilityAccessCtrl.createAtManager();
try {
atManager.requestPermissionsFromUser(this.context,['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
.then((data) => {
})
.catch((err: BusinessError) => {
})
} catch (err) {
hilog.error(0x0000, TAG, `catch err->${JSON.stringify(err)}`);
}
背景知识:
1、权限分类与级别
| 权限级别 | 权限名称 | 常量值 | 精度范围 | 是否需要申请 |
|---|---|---|---|---|
| 精确位置 | ohos.permission.LOCATION | location.LOCATION | 精确到米级别 | 需要单独申请 |
| 模糊位置 | ohos.permission.APPROXIMATELY_LOCATION | location.LOCATION | 精确到公里级别 | 需 |
场景一:只申请模糊位置,系统会根据权限级别智能合并弹窗
// 在module.json5中声明
"requestPermissions": [
{
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:location_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
场景二:只申请精确位置;用户只会看到一次权限请求弹窗,询问是否允许应用获取大致位置。
"requestPermissions": [
{
"name": "ohos.permission.LOCATION",
"reason": "$string:location_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
场景三:同时申请精确和模糊位置(最常见)
"requestPermissions": [
{
"name": "ohos.permission.LOCATION",
"reason": "$string:precise_location_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:approximate_location_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
- 首次请求时:系统会显示一个合并的弹窗,询问用户是否允许应用获取位置信息
- 用户选择时:弹窗会提供两个选项:
- 精确位置(包含模糊位置权限)
- 模糊位置(仅模糊位置权限)
- 拒绝
只需申请一次,也只会显示一次弹窗。
可以这样理解:
HarmonyOS NEXT 里:
模糊位置
≈ 粗略定位
精确位置
≈ 高精度定位
两者不是完全独立的两套权限。
正常情况下:
如果你已经申请并获得了:
精确位置
那么:
模糊位置能力默认也包含了
不需要再单独申请一次。
也就是说:
精确位置 > 模糊位置
属于包含关系。
因此:
一般不需要:
弹两次权限框
正确做法通常是:
一次申请:
精确位置权限
用户同意后:
- 精确定位可用
- 模糊定位也可用
但有一个容易混淆的点:
系统权限里通常会区分:
- 是否允许定位
- 是否允许精确定位
有些系统版本:
用户可能会:
只给模糊定位
拒绝精确定位
这种情况下:
你的应用:
- 仍能拿到模糊位置
- 但拿不到高精度坐标
这和 Android 现在的逻辑有点类似。
所以实际开发建议:
如果业务必须高精度:
直接申请精确位置
不要:
- 先申请模糊
- 再申请精确
否则确实可能出现:
连续两次弹窗
用户体验会比较差。
一句话总结:
精确位置通常包含模糊位置能力。
正常只需要申请一次精确位置,不需要再单独申请模糊位置。
不用
不用,申请全选的时候两个都写就行
是的
在HarmonyOS Next中,精确位置(ohos.permission.LOCATION)和模糊位置(ohos.permission.APPROXIMATELY_LOCATION)是独立权限。若仅申请精确位置权限,系统会自动授权模糊位置,无需二次申请。若分别声明,用户会看到两个弹窗。通常只声明精确位置权限即可满足两种需求。
在HarmonyOS Next中,应用如果同时需要精确位置和模糊位置,无需申请两次,也只需显示一次弹窗。
只需在module.json5中同时声明ohos.permission.LOCATION(精确位置)和ohos.permission.APPROXIMATELY_LOCATION(模糊位置),运行时调用requestPermissionsFromUser一次性传入这两个权限,系统会合并为一个授权弹窗,让用户选择“精确位置”或“大致位置”。如果用户选择精确位置,则两个权限都会被授予,模糊位置无需再单独申请;若选择大致位置,则仅授予模糊位置权限,精确位置会被拒绝。 因此,获得精确位置授权后即可直接使用模糊位置,不存在重复弹窗问题。

