【问题标题】:Chrome Extension - getUserMedia throws "NotAllowedError: Failed due to shutdown"Chrome 扩展 - getUserMedia 抛出“NotAllowedError:因关机而失败”
【发布时间】:2018-06-22 15:34:18
【问题描述】:

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

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

正在投掷

NotAllowedError: Failed due to shutdown

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

【问题讨论】:

标签: javascript google-chrome google-chrome-extension getusermedia


【解决方案1】:

哇,这是雷区。

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

所以我们需要围绕它编写代码。

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

那么,步骤如下:

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

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

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

至关重要的是,内容脚本必须在扩展程序的上下文中运行,而不是当前网页(在活动选项卡中)。也就是说,内容脚本必须通过以 @987654323 开头的 URL 执行此操作@,由chrome.runtime.getURL()生成。

这样用户只被要求授予一次权限,因为他们的决定是在逐个域的基础上记住的。在扩展程序上下文而不是当前网页中运行脚本意味着始终在同一个基于扩展程序的域中询问权限(并记住该决定),而不是针对访问的每个网站域再次询问。

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

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

呼……

【讨论】:

  • 您为什么决定在后台脚本而不是弹出脚本中进行录制?
  • 因为弹窗脚本在弹窗关闭后立即死亡,而弹窗在失去焦点时关闭。我希望用户能够记录自己与屏幕的交互,这将触发弹出关闭。
  • 知道了。我完全使用了你的解决方案:我首先在内容脚本中调用navigator.mediaDevices.getUserMedia,然后向后台脚本发送一条消息,然后调用完全相同的函数,但现在我得到一个与第一个非常相似的错误:DOMException: Failed due to shutdown from后台脚本。任何想法,这里可能是什么问题?谢谢!
  • 嗯,这绝对是敲响了警钟。我不记得那是怎么回事了——这可能是某个人在 Chrome 开发者论坛上知道的错误?我确实看过几次,但不记得我做了什么来摆脱它。
  • 您还记得在扩展程序的上下文中运行内容脚本是什么意思吗?可能是将其添加到content_scripts"matches": ["<all_urls>"] 下?
【解决方案2】:

Utkanos 的回答很棒,但不要忘记添加

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

【讨论】:

  • 这个!追这个 bug 几个小时了。
  • HAHAHAHAAHAHAHAHAHAHAHAHAHAHAH f***** 这让我头疼。
  • 非常感谢兄弟:D
【解决方案3】:

在 manifesto.json 中包含这个为我解决了这个问题。

"web_accessible_resources": ["background.js"]

【讨论】:

  • 这没什么意义。后台脚本和网络可用资源彼此没有任何共同之处。后者允许通过chrome:// URL 允许在您的扩展程序中托管的资产可用于当前网页。
  • 不知何故,它绕过了请求相机的许可,我能够在后台脚本中使用相机,在最新的 chrome 更新后,此选项不再可用。但它只工作了整整两周,直到更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多