Подтвердить что ты не робот

Как предоставить разрешение webkitGetUserMedia во всплывающем окне расширения Chrome?

Я успешно использовал webkitGetUserMedia для захвата видео с веб-камеры на обычной веб-странице, но когда я пытаюсь сделать это в popup.html моего расширения Chrome, ничего не происходит. Я не получаю никаких разрешений, просто он даже не спрашивает (inforbar никогда не скользит во всплывающем окне). Есть ли способ обойти это? Это не похоже, что я могу давать разрешения в манифесте json.

4b9b3361

Ответ 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
  }