HarmonyOS 鸿蒙Next中navigator.permissions.query接口返回始终为denied

HarmonyOS 鸿蒙Next中navigator.permissions.query接口返回始终为denied 在6.1.0系统版本自带的浏览上,打开演示站点,通过navigator.mediaDevices.getUserMedia(),申请网站的相机权限;允许之后,清除并重置当前网站之后,通过navigator.permissions.query()永远返回denied

10 回复

应用内 Web 组件不能只看 navigator.permissions.query()。ArkWeb 权限链路是两层:应用先声明并申请 CAMERA/MICROPHONE;H5 调 getUserMedia 时,Web 组件触发 onPermissionRequest,应用再根据用户授权 request.grant。ArkWeb 安全最佳实践也说明,默认情况下 ArkWeb 组件拒绝权限授予。建议以 getUserMedia 成功/失败为准,并补齐 onPermissionRequest。 依据: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-arkweb-component-security https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-basic-components-web-events#onpermissionrequest9

更多关于HarmonyOS 鸿蒙Next中navigator.permissions.query接口返回始终为denied的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


尊敬的开发者,您好,为了尽快解决您的问题,需要您进一步提供如下信息:

问题场景为浏览器,需要确认以下几点:

  1. 请说明一下设备类型(手机/平板)
  2. navigator.permissions.query查询的是camera或microphone的权限吗?
  3. 授权通过后,查询的结果是什么?是granted吗?
  4. 增加了清理重置操作之后,出现的denied吗? 同时请同步提供录屏和对应的hilog日志更清晰的定位(确保录屏和日志时间能对应上):
  5. hdc shell
  6. cd data/log/hilog
  7. hilog -w clear (清除多余日志)
  8. exit (退出hdc shell)
  9. (录屏)复现问题
  10. hdc file recv /data/log/hilog 导出hilog日志

背景知识:

问题原因是HarmonyOS 6.1 ArkWeb 内核已知 BUG。鸿蒙 query 不准,不能依赖permissions.query判断权限,改用异常捕获判断可用状态。如下:

问题解决:

示例代码:

// 不要依赖query,6.1鸿蒙query结果不可信
async function checkCameraAuth() {
  try {
    // 尝试短暂拉起相机,成功=已授权
    const stream = await navigator.mediaDevices.getUserMedia({video:true});
    stream.getTracks().forEach(t=>t.stop());
    return 'granted';
  }catch(err){
    // 两种情况:denied(用户拒绝) / prompt(待弹窗授权)
    if(err.name === 'NotAllowedError'){
      return 'denied'
    }else{
      return 'prompt'
    }
  }
}

不建议把 navigator.permissions.query() 当成 HarmonyOS/ArkWeb 权限状态的唯一判断依据。Web Permissions API 在不同浏览器/WebView 中支持差异比较大,相机这类权限更要以 getUserMedia() 的实际成功/失败以及浏览器/ArkWeb 的权限回调为准。

如果是在应用内 Web 组件里,权限链路通常是两层:ArkTS 侧先声明并申请 CAMERA/MICROPHONE 等原生权限;H5 调 getUserMedia 时,Web 组件侧再处理权限请求并 grant/deny。若是系统浏览器场景,还要确认站点是 HTTPS 安全上下文,并清理站点权限后重新验证。你这个现象更像权限状态查询和真实授权链路没有同步,建议业务上不要依赖 query 的 denied 直接判定不可用。

你的网站网页是http还是https访问。是已正式发布还是本地localhost测试。

浏览器设置–>网站设置里检查 所有网站和权限,都关了重新打开你的网页。

用 navigator.mediaDevices.getUserMedia() 不要使用 navigator.permissions.query()
这是个 HarmonyOS WebView 的已知 bug,不是你的代码问题!

这个现象大概率不是你代码问题,而是 HarmonyOS 6.1 当前 ArkWeb/WebView 权限状态同步的兼容问题。

简单说:

navigator.mediaDevices.getUserMedia()

实际上已经成功申请到了权限,

但是:

navigator.permissions.query()

返回的权限状态没有正确同步,所以始终是:

denied

目前在 HarmonyOS 6.1 自带浏览器 / ArkWeb 上,这种情况有人遇到过,尤其是:

  • 清除网站数据后
  • 重置权限后
  • 多次授权拒绝后
  • 系统权限与网页权限混合时

最容易复现。

本质上像是:

Permissions API 状态缓存异常

或者:

ArkWeb 对 W3C Permissions API 支持不完整

因为如果:

getUserMedia()

真的没有权限,

它应该直接抛:

NotAllowedError

而不是还能正常拉起相机。

所以现在实际情况通常是:

真实权限 = 已授权
Permissions API 返回 = denied

属于状态不一致。

另外一个关键点:

很多浏览器里:

navigator.permissions.query({ name: 'camera' })

本身就不是强标准统一实现。

不同 WebView 差异很大。

尤其:

  • HarmonyOS ArkWeb
  • Android WebView
  • Safari

都存在兼容差异。

所以很多成熟 H5 项目实际上:

根本不依赖:

navigator.permissions.query()

而是直接:

try {
  await navigator.mediaDevices.getUserMedia(...)
}

成功即认为有权限。

失败再处理。

这是现在业内更通用方案。

因为:

Permissions API 兼容性一直不太稳定。

你现在这个现象:

“清除网站并重置后永远 denied”

很像:

ArkWeb 权限缓存没刷新。

可以尝试几个办法验证:

  1. 完全退出浏览器进程

不是关闭页面。

而是:

最近任务划掉浏览器。

再重新进入。

因为:

ArkWeb 权限状态有进程级缓存。

  1. 系统设置里清权限

设置:

应用 -> 浏览器 -> 权限 -> 相机

手动关闭再打开。

  1. 换新域名测试

有时:

同域名权限缓存会异常。

  1. 不依赖 query()

建议直接:

await getUserMedia()

判断。

例如:

async function checkCamera() {
  try {
    await navigator.mediaDevices.getUserMedia({ video: true });
    console.log('有权限');
  } catch (e) {
    console.log('无权限');
  }
}

比:

navigator.permissions.query()

稳定很多。

最后总结一下:

你这个更像:

HarmonyOS 6.1 ArkWeb 对 Permissions API 的兼容问题

而不是:

你网站权限真的被拒绝了。

目前更推荐:

  • 不依赖 query()
  • 直接调用 getUserMedia()
  • 用异常判断权限状态

这也是现在很多 WebRTC/H5 相机项目的实际做法。

更新下浏览器试下呢,或者杀掉浏览器进程重启试下

要不就是重新安装下,重现刚刚的步骤看下是否还存在

鸿蒙Next中navigator.permissions.query始终返回denied,是因为其Web组件对Permissions API的支持有限,仅部分内置权限(如地理位置、通知)可查询。其他权限类型(如clipboard-write)未被实现,默认返回denied。此外,需确认应用已在module.json5中声明了对应ohos.permission。若声明后仍为denied,则表明该权限当前不支持通过Web API查询。

在 HarmonyOS Next 中,浏览器的权限存储与 Permissions API 并非完全联动。使用“清除并重置网站”后,相机权限授权记录被删除,但 navigator.permissions.query({name: 'camera'}) 不会自动触发权限请求,而是查询当前持久化状态,因此返回 denied。要恢复授权,必须先再次调用 getUserMedia 让用户重新同意,此时权限状态才会更新为 granted。这是权限重置后的预期表现。

回到顶部