Как предоставить разрешение webkitGetUserMedia во всплывающем окне расширения Chrome?
Я успешно использовал webkitGetUserMedia для захвата видео с веб-камеры на обычной веб-странице, но когда я пытаюсь сделать это в popup.html моего расширения Chrome, ничего не происходит. Я не получаю никаких разрешений, просто он даже не спрашивает (inforbar никогда не скользит во всплывающем окне). Есть ли способ обойти это? Это не похоже, что я могу давать разрешения в манифесте json.
Ответы
Ответ 1
Это дешевый взлом, но если вы создадите страницу параметров для своего расширения и включаете вызов webkitGetUserMedia
в JS для него, он будет запрашивать разрешение для всех URI для этого расширения, после того как пользователь разрешит его в странице параметров, страница фона также будет иметь разрешение на ее использование.
Ответ 2
Расширения Chrome и WebRTC:
Документация разрешений манифеста расширений Chrome не содержит двух разрешений, необходимых в манифесте, "videoCapture" и "audioCapture", поэтому я не уверен, эта функциональность доступна для Chrome Extensions или нет, вы должны попробовать и посмотреть, что происходит, прежде чем продолжить!;)
Chrome Packaged Apps и WebRTC:
Однако в Chrome Packaged приложениях это возможно, как в песочных, так и в неизолированных страницах! Приложения Chrome Packaged очень похожи на расширения, поэтому в зависимости от того, что вы делаете, вы можете захотеть создать приложение.
В Документах по разрешению манифестных приложений для пакетов разрешения "videoCapture" и "audioCapture" явно не указаны, но один из них показан в примере.
У меня есть упакованное приложение, которое использует изолированную HTML-страницу для запуска webkitGetUserMedia, и она отлично работает. Вот что вам нужно в вашем манифесте:
{
"name": "app name",
"version": "0.2",
"manifest_version": 2,
"minimum_chrome_version": "21",
"app": {
"background": {
"scripts": ["main.js"]
}
},
"icons": {
/* "128": "icon_128.png" */
},
"sandbox": {
"pages": ["call.htm" ]
},
"permissions" : [ "videoCapture", "audioCapture" ]
}
Затем вам нужно запустить всплывающее окно с страницы chrome://newtab в качестве приложения. Main.js должен содержать что-то вроде этого:
// Chrome v24+
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create('mainpage.html',
{width: 1190, height: 709});
});
И главной страницей должно быть ваше всплывающее окно. В моей настройке у меня есть iframe, называемый call.htm внутри mainpage.html, а страница iframe изолирована песочницей, поэтому она может выполнять некоторые небезопасные операции, которые могут выполняться только как обычная веб-страница. Однако, если я запустил команду getUserMedia в всплывающем окне без песочницы, я получаю объект MediaStream от вызова webkitGetUserMedia:
navigator.webkitGetUserMedia({ audio: true, video: true },
function (stream) {
mediaStream = stream;
},
function (error) {
console.error("Error trying to get the stream:: " + error.message);
});
Я тестировал его, и я смог записать свое видео в всплывающее окно.
Ответ 3
Как было предложено @tsbarnes, есть взлома, но для приложений Chrome хак отличается, вы вызываете navigator.webkitGetUserMedia из background.js
вместо этого, что-то вроде:
navigator.webkitGetUserMedia({audio: true, video: true}, function() {
console.log('ok');
}, function(e) {
console.log('webcam not ok');
});
И тогда вы по-прежнему можете получить доступ к аудио/видео из window.html или любого другого веб-представления
Ответ 4
Запрос navigator.webkitGetUserMedia
в options.js
работает, но вы ДОЛЖНЫ открывать всплывающее окно option.html
в NEW TAB или вы получите ошибку, поэтому в manifest.json
вы должны написать
"options_ui": {
"page": "options.html",
"chrome_style": true,
"open_in_tab": true
}