Расширение 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"]