Javascript 如何让FirefoxWebExtension使用麦克风

Javascript 如何让FirefoxWebExtension使用麦克风,javascript,firefox,microphone,firefox-addon-webextensions,Javascript,Firefox,Microphone,Firefox Addon Webextensions,我一直在尝试制作Firefox扩展,它需要用户能够录制语音消息。 我已经创建了一个可以工作的网页,但是当我在扩展中放入相同的代码(带有所有适当的manifest.json更改)时,它就不工作了。它只是不要求用户访问麦克风 我查看了Firefox站点上的扩展示例,但找不到解决方案 如果可以,分机如何访问用户麦克风 代码: 以及initAudio功能: function initAudio() { console.log("initAudio"); if (!navigator.getUserMed

我一直在尝试制作Firefox扩展,它需要用户能够录制语音消息。 我已经创建了一个可以工作的网页,但是当我在扩展中放入相同的代码(带有所有适当的manifest.json更改)时,它就不工作了。它只是不要求用户访问麦克风

我查看了Firefox站点上的扩展示例,但找不到解决方案

如果可以,分机如何访问用户麦克风

代码:

以及initAudio功能:

function initAudio() {
console.log("initAudio");
if (!navigator.getUserMedia)
    navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mediaDevices.mozGetUserMedia;
if (!navigator.cancelAnimationFrame)
    navigator.cancelAnimationFrame = navigator.webkitCancelAnimationFrame || navigator.mozCancelAnimationFrame;
if (!navigator.requestAnimationFrame)
    navigator.requestAnimationFrame = navigator.webkitRequestAnimationFrame || navigator.mozRequestAnimationFrame;

console.log("initAudio");
navigator.mediaDevices.getUserMedia(
    {
        "audio": {
            "mandatory": {
                "googEchoCancellation": "false",
                "googAutoGainControl": "false",
                "googNoiseSuppression": "false",
                "googHighpassFilter": "false"
            },
            "optional": []
        },
    }, gotStream, function (e) {
        console.log('Error getting audio');
        $("#controls").css("background", "red");
        console.log(e);
    });
}
我没有得到控制台输出

获取音频时出错

但是我也没有从gotStream函数中获得控制台输出

稍后,我有一个触发录制过程的HTML对象:

    <img id="record" src="./res/icons/mic.png" class="">
函数toggleRecording确实正确触发,但由于记录器对象未初始化(它在gotStream函数中初始化),因此无法工作

以下是manifest.json文件:

    {

  "manifest_version": 2,
  "name": "Speech",
  "version": "1.1",

  "description": "blank desript",
  "icons": {
    "16": "popup/res/icons/icon16.png",
    "32": "popup/res/icons/icon32.png",
    "48": "popup/res/icons/icon48.png",
    "128": "popup/res/icons/icon128.png"
  },

  "permissions": [
    "storage"
  ],

  "browser_action": {
    "default_icon": {
      "32": "popup/res/icons/icon.png"
    },
    "default_title": "Speech",
    "default_popup": "popup/popup.html"
  },

  "content_scripts": [
    {
      "js": [
        "popup/res/script/jquery-3.2.1.js",
        "popup/res/script/audiodisplay.js",
        "popup/res/script/recorder.js",
        "popup/res/script/recorderWorker.js",
        "popup/res/script/resampler.js",
        "popup/res/script/main.js"
      ],
      "matches": [ "<all_urls>" ],
      "match_about_blank": true,
      "all_frames": true
    }
  ],

  "content_security_policy": [
    "script-src 'unsafe-inline'"
  ]


}
{
“清单版本”:2,
“姓名”:“讲话”,
“版本”:“1.1”,
“描述”:“空白描述”,
“图标”:{
“16”:“popup/res/icons/icon16.png”,
“32”:“popup/res/icons/icon32.png”,
“48”:“popup/res/icons/icon48.png”,
“128”:“popup/res/icons/icon128.png”
},
“权限”:[
“存储”
],
“浏览器操作”:{
“默认_图标”:{
“32”:“popup/res/icons/icon.png”
},
“默认标题”:“演讲稿”,
“默认弹出窗口”:“popup/popup.html”
},
“内容脚本”:[
{
“js”:[
“popup/res/script/jquery-3.2.1.js”,
“popup/res/script/audiodisplay.js”,
“popup/res/script/recorder.js”,
“popup/res/script/recorderWorker.js”,
“popup/res/script/resampler.js”,
“popup/res/script/main.js”
],
“匹配项”:[“”],
“match_about_blank”:正确,
“所有帧”:正确
}
],
“内容安全策略”:[
“脚本src‘不安全内联’”
]
}

请选择主题中的问题:包括重复该问题的问题。对于Chrome扩展或Firefox WebExtensions,这几乎总是意味着包括manifest.json和一些背景、内容和/或弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。另请参见:,和。@Makyen现在好些了吗?:)这是一个进步,但还需要更多。我们需要知道您显示的代码存在于哪个JavaScript文件中。我们需要知道您正在使用的JavaScript库的源代码。我们可以找到jQuery,假设您声明了哪个版本,但其他版本我们必须猜测。a的要点是,我们可以获取问题中的信息/代码,并能够准确地复制问题。这使我们能够找到问题并验证修复。充其量,问题中没有足够的信息意味着我们不得不猜测到底发生了什么。这里有一些更多的信息:之所以需要a,是因为我们想提供帮助。如果我们不必重新创建复制问题所需的任何代码,那么帮助就容易多了。这是您已经拥有的代码。因此,请帮助我们帮助您,并提供一个完整的复制问题。如果没有a,甚至开始帮助你所需的努力量也要高得多,这大大减少了愿意/能够帮助你的人数。即使我们付出了额外的努力,我们也必须猜测您的问题的重要部分。这是稍后要处理的一个附带问题,但是:除非您需要,否则请不要将jQuery和所有这些库加载到每个页面(
内容脚本
,以及您的
匹配项
)。jQuery是85kiB的最小化代码和其他更多的代码。这是一个沉重的负担,每一页都要负担。我们这些打开100个标签的人怎么办?最好的做法是加载所需的绝对最小值,以仅显示UI的初始元素(无动画)&检测开始与它交互的用户。如果需要,则使用
tabs.executeScript()
加载所需的所有其他内容。请将问题添加到主题中:包括重复问题的问题。对于Chrome扩展或Firefox WebExtensions,这几乎总是意味着包括manifest.json和一些背景、内容和/或弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。另请参见:,和。@Makyen现在好些了吗?:)这是一个进步,但还需要更多。我们需要知道您显示的代码存在于哪个JavaScript文件中。我们需要知道您正在使用的JavaScript库的源代码。我们可以找到jQuery,假设您声明了哪个版本,但其他版本我们必须猜测。a的要点是,我们可以获取问题中的信息/代码,并能够准确地复制问题。这使我们能够找到问题并验证修复。充其量,问题中没有足够的信息意味着我们不得不猜测到底发生了什么。这里有一些更多的信息:之所以需要a,是因为我们想提供帮助。如果我们不必重新创建复制问题所需的任何代码,那么帮助就容易多了。这是您已经拥有的代码。因此,请帮助我们帮助您,并提供一个完整的复制问题。如果没有a,甚至开始帮助你所需的努力量也要高得多,这大大减少了愿意/能够帮助你的人数。即使我们付出了额外的努力,我们也必须猜测问题的重要部分。这是稍后要处理的一个次要问题,但是:请不要加载jQuery和所有这些
$(document).ready(function () {
$("#record").click(function () {
    console.log("trigerred", this);
    toggleRecording(this);
});
});
    {

  "manifest_version": 2,
  "name": "Speech",
  "version": "1.1",

  "description": "blank desript",
  "icons": {
    "16": "popup/res/icons/icon16.png",
    "32": "popup/res/icons/icon32.png",
    "48": "popup/res/icons/icon48.png",
    "128": "popup/res/icons/icon128.png"
  },

  "permissions": [
    "storage"
  ],

  "browser_action": {
    "default_icon": {
      "32": "popup/res/icons/icon.png"
    },
    "default_title": "Speech",
    "default_popup": "popup/popup.html"
  },

  "content_scripts": [
    {
      "js": [
        "popup/res/script/jquery-3.2.1.js",
        "popup/res/script/audiodisplay.js",
        "popup/res/script/recorder.js",
        "popup/res/script/recorderWorker.js",
        "popup/res/script/resampler.js",
        "popup/res/script/main.js"
      ],
      "matches": [ "<all_urls>" ],
      "match_about_blank": true,
      "all_frames": true
    }
  ],

  "content_security_policy": [
    "script-src 'unsafe-inline'"
  ]


}