HarmonyOS鸿蒙Next中应用需要使用精确位置和模糊位置,是否需要申请两次?显示两次弹窗?

HarmonyOS鸿蒙Next中应用需要使用精确位置和模糊位置,是否需要申请两次?显示两次弹窗? 是否申请了精确位置后,模糊位置不需要申请即可使用?

11 回复

不是“申请了精确位置就自动拿到模糊位置”这么理解。API 9 及以后,定位权限建议按能力拆开看:

只申请 ohos.permission.APPROXIMATELY_LOCATION,用户授权后只能获取模糊位置;只申请 ohos.permission.LOCATION 通常不满足精确定位申请条件,可能授权失败或拿不到定位。

需要精确定位时,建议在 module.json5 同时声明 APPROXIMATELY_LOCATIONLOCATION,运行时也一次性把这两个权限传给 requestPermissionsFromUser。这样通常是一次系统授权流程,不是业务代码里强行弹两次。

回调里按 data.authResults[i] 对应 permissions[i] 判断。如果用户只给了模糊定位,就按模糊能力降级;只有两个都授权时,再走精确定位逻辑。

更多关于HarmonyOS鸿蒙Next中应用需要使用精确位置和模糊位置,是否需要申请两次?显示两次弹窗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


精确定位和模糊定位的调用方法分别是什么?如果仅获得模糊定位权限,代码里却调用精确定位方法,会不会报错?

参考《Location Kit》,有明确说明,也有《示例》
如果两者都申请了。在授权时会有开关可选择。两种定位统一调用,不分接口。

cke_4914.png

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一次性传入这两个权限,系统会合并为一个授权弹窗,让用户选择“精确位置”或“大致位置”。如果用户选择精确位置,则两个权限都会被授予,模糊位置无需再单独申请;若选择大致位置,则仅授予模糊位置权限,精确位置会被拒绝。 因此,获得精确位置授权后即可直接使用模糊位置,不存在重复弹窗问题。

回到顶部