Расширение Chrome - getUserMedia выдает "NotAllowedError: Ошибка из-за выключения"

У меня есть набор, который записывает веб-камеру пользователя и микрофон. Он прекрасно работает на веб-странице, но в Chrome Extension есть строка:

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

бросает

NotAllowedError: Failed due to shutdown

Я искал и не нашел почти ничего, что могло бы объяснить это. Кто-нибудь еще сталкивался с этим или знает, что я могу с этим сделать?

3 ответа

Вау, это минное поле.

Во-первых, кажется, что это ошибка (спасибо, @wOxxOm).

Так что нам нужно обойти это.

Поскольку фоновый скрипт генерирует эту ошибку при запросе доступа к медиафайлам, мы должны запросить его в другом месте. Та же ошибка генерируется, если вы пытаетесь из всплывающего JS, так что остаются контентные скрипты.

Затем выполняются следующие шаги:

  • Скрипт контента запрашивает доступ к медиаустройствам

  • В случае успеха, сценарий содержимого сообщения фонового сценария

  • При получении сообщения фоновый скрипт запрашивает доступ к медиаустройствам; поскольку скрипт содержимого уже выполнен успешно, фоновый скрипт теперь также будет выполнен успешно

Важно, что скрипт контента должен запускаться в контексте расширения, а НЕ на текущей веб-странице (на активной вкладке.)

Мой подход состоял в том, чтобы иметь постоянный контент-скрипт (указанный в манифесте под content_scripts) чья работа при открытии расширения - вставлять iframe на страницу текущей вкладки.

В этот iframe загружается страница из расширения, давайте назовем это iframe.html,

На этой странице есть JavaScript, который запрашивает доступ к медиа.

Уф...

Ответ Утканоса отличный, но не забудьте добавить

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

Включение этого в файл manifest.json решило проблему для меня.

      "web_accessible_resources": ["background.js"]
Другие вопросы по тегам