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"]
我有一个套件可以记录用户的网络摄像头和麦克风。它在网页上运行良好,但在 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()
.
chrome://
来实现
这样一来,用户只会被请求一次权限,因为他们的决定会逐个域地被记住。 运行 扩展上下文中的脚本,而不是当前网页,意味着总是在相同的基于扩展的域中请求权限(并记住决定),而不是再次访问每个网站域。
我的方法是拥有一个持久性内容脚本(在 content_scripts
下的清单中指定),其工作是在打开扩展程序时将 iframe 注入当前选项卡的页面。
从扩展程序加载一个页面到 iframe 中,我们称之为 iframe.html
,它最终负责请求访问。
呼...
Utkanos 的回答很好,但别忘了补充
frame.setAttribute("allow", "microphone; camera");
将此包含在 manifesto.json 中解决了我的问题。
"web_accessible_resources": ["background.js"]