开发者社区 问答 正文

getUserMedia获取权限一直处于pending状态

复现步骤

App拒绝摄像头麦克风权限之后,打开h5页面,调用getUserMedia方法,系统弹出授权提示框,点击同意,此时无法调起摄像头,代码抛出NotAllowedError错误。然后再次调用getUserMedia方法,系统无法弹出授权框,而且getUserMedia方法也没有响应。

const navigatorGetUserMedia = async (constrains) => {
  if (navigator.mediaDevices.getUserMedia) {
    return navigator.mediaDevices.getUserMedia(constrains);
  } else if (navigator.webkitGetUserMedia) {
    return navigator.webkitGetUserMedia(constrains);
  } else if (navigator.mozGetUserMedia) {
    return navagator.mozGetUserMedia(constrains);
  } else if (navigator.getUserMedia) {
    return navigator.getUserMedia(constrains);
  }
}


// 二次调用navigatorGetUserMedia, 会一直处于pending状态
const stream = await navigatorGetUserMedia({
  video: true,
  audio: true
});

展开
收起
游客k575jepiuhuyu 2022-08-30 11:55:17 1811 分享 版权
阿里云 AI 助理回答

针对您遇到的问题,即App在用户首次拒绝摄像头和麦克风权限后,再次尝试调用getUserMedia方法时无法正常弹出授权提示且抛出错误的情况,可以参考以下解决方案:

问题分析

  • 首次拒绝权限:用户首次拒绝权限后,部分浏览器或WebView环境可能不会再次自动触发权限请求对话框。
  • NotAllowedError:此错误表明用户已拒绝访问摄像头或麦克风资源。

解决步骤

Android平台

  1. 权限管理

    • 确保在AndroidManifest.xml中已经声明了相关权限:
      <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.RECORD_AUDIO" />
      
    • 在您的Activity或Fragment中,重写onRequestPermissionsResult方法以处理权限请求的结果,并根据结果采取相应行动。
  2. 自定义权限请求处理

    • 如文档所述,对于WebView内页面的权限请求,需要重写WebChromeClientonPermissionRequest方法,确保在用户同意时正确授予所有请求的权限。

iOS平台

  1. Info.plist配置

    • 确认Info.plist文件中已添加了相机和麦克风的使用描述:
      <key>NSCameraUsageDescription</key>
      <string>需要访问您的摄像头以进行视频通话</string>
      <key>NSMicrophoneUsageDescription</key>
      <string>需要访问您的麦克风以进行语音通话</string>
      
  2. 权限检查与引导

    • 在调用getUserMedia之前,主动检查麦克风权限状态。如果权限被拒绝,可以通过代码引导用户至系统设置页面开启权限,如Harmony SDK示例中的做法所示,尽管这是Harmony OS的示例,但思路类似,即通过系统API检查权限并引导用户操作。
  3. 处理连续调用问题

    • 当前实现中,连续调用navigatorGetUserMedia可能会导致Promise处于pending状态。考虑在每次调用前检查是否已有挂起的权限请求或媒体流获取操作,并适当处理这些情况,避免并发冲突。

代码调整建议

  • 在您的JavaScript代码中,虽然您已经尝试了多种getUserMedia的兼容调用方式,但在解决权限问题上,重点应放在原生应用层面对权限的管理和处理上。
  • 考虑增加逻辑,在调用getUserMedia前,利用原生桥接(如React Native、Cordova等框架提供的功能)检查并请求权限,确保权限已被正确授予后再执行媒体设备访问操作。

注意事项

  • 权限教育:向用户清晰说明为何应用需要这些权限,提升用户同意的概率。
  • 用户体验:在权限请求被拒后,提供明确的指引帮助用户重新开启权限,而不是直接静默失败。

通过上述措施,您可以改善当前应用在处理摄像头和麦克风权限问题上的体验,确保在用户同意权限后能成功调用getUserMedia方法。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答