Chrome Extension - getUserMedia throws "NotAllowedError: Failed due to shutdown"

Chrome Extension - getUserMedia throws "NotAllowedError: Failed due to shutdown"

我有一个套件可以记录用户的网络摄像头和麦克风。它在网页上运行良好,但在 Chrome 扩展行中:

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

正在投掷

NotAllowedError: Failed due to shutdown

我搜索了一下,几乎找不到任何可以解释这一点的内容。有其他人遇到过这个问题吗?或者有人知道我能做些什么吗?

哇,这是雷区。

首先,这似乎是 a bug(感谢 @wOxxOm)。

所以我们需要围绕它进行编码。

由于后台脚本在请求媒体访问时产生了这个错误,我们需要在别处请求它。如果您从弹出式 JS 尝试,则会生成相同的错误,因此留下 content scripts.

那么步骤是:

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

  • 成功后,内容脚本通知后台脚本

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

重要的是,内容脚本 必须 运行 在扩展程序 的上下文中,而不是当前网页(在活动选项卡中)。也就是说,内容脚本必须通过由 chrome.runtime.getURL().

生成的 URL 开头 chrome:// 来实现

这样一来,用户只会被请求一次权限,因为他们的决定会逐个域地被记住。 运行 扩展上下文中的脚本,而不是当前网页,意味着总是在相同的基于扩展的域中请求权限(并记住决定),而不是再次访问每个网站域。

我的方法是拥有一个持久性内容脚本(在 content_scripts 下的清单中指定),其工作是在打开扩展程序时将 iframe 注入当前选项卡的页面。

从扩展程序加载一个页面到 iframe 中,我们称之为 iframe.html,它最终负责请求访问。

呼...

Utkanos 的回答很好,但别忘了补充

frame.setAttribute("allow", "microphone; camera");

将此包含在 manifesto.json 中解决了我的问题。

"web_accessible_resources": ["background.js"]