Chrome扩展程序-getUserMedia引发“ NotAllowedError:由于关机失败”

Utk*_*nos 6 javascript google-chrome google-chrome-extension getusermedia

我有一个套件,可以记录用户的网络摄像头和麦克风。它在网页上效果很好,但在Chrome扩展程序中,该行如下:

navigator.mediaDevices.getUserMedia({video: true, audio: true})
    .then(this.record.bind(this))
    .catch(VidRA.error);
Run Code Online (Sandbox Code Playgroud)

NotAllowedError: Failed due to shutdown
Run Code Online (Sandbox Code Playgroud)

我搜索后发现几乎没有任何东西可以解释这一点。有没有其他人遇到过这个问题,或者有人知道我能做些什么?

Utk*_*nos 6

哇,这是雷区。

首先,这似乎是一个错误(感谢@wOxxOm)。

因此,我们需要围绕它进行编码。

由于后台脚本在请求媒体访问时会生成此错误,因此我们需要在其他位置请求它。如果尝试从弹出式JS生成相同的错误,那么将留下内容脚本

然后,这些步骤是:

  • 内容脚本请求访问媒体设备

  • 成功后,内容脚本消息背景脚本

  • 收到消息后,后台脚本请求访问媒体设备;由于内容脚本已经成功,因此后台脚本现在也将成功

至关重要的是,内容脚本必须在扩展程序的上下文中运行,而不是在当前网页(在活动选项卡中)中运行。这样一来,用户仅被询问一次权限,因为他们的决定会逐个域记住。在扩展程序(而不是当前网页)的上下文中运行脚本意味着始终在同一域(扩展域,即chrome://...。)中询问权限(并记住决定)。

我的方法是拥有一个持久的内容脚本(在清单中的清单中指定content_scripts),其工作是在打开扩展名时将iframe注入当前标签页中。

从扩展名将一个页面加载到该iframe中,我们称它为iframe.html

在该页面中,有JavaScript请求媒体访问。

ew ...


小智 5

乌特卡诺斯的回答很好,但不要忘记添加

frame.setAttribute("allow", "microphone; camera");
Run Code Online (Sandbox Code Playgroud)