webkitGetUserMedia を使用して、通常の Web ページで Web カメラからビデオをキャプチャすることに成功しましたが、Chrome 拡張機能の popup.html でこれを実行しようとしても何も起こりません。許可エラーは発生しません。尋ねることさえないようです(インフォバーがポップアップウィンドウでスライドダウンすることはありません)。これを回避する方法はありますか?マニフェストjsonで権限を付与できるようには見えません。
4 に答える
これは安価なハックですが、拡張機能のオプション ページを作成しwebkitGetUserMedia
、その JS に呼び出しを含めると、その拡張機能のすべての URI に対する許可が要求されます。ユーザーがオプション ページでそれを許可した後、バックグラウンド ページは使用許可も得ています。
Chrome 拡張機能と WebRTC:
Chrome 拡張機能マニフェストのアクセス許可のドキュメントには、マニフェストで必要な 2 つのアクセス許可、「videoCapture」と「audioCapture」については言及されていないため、その機能が Chrome 拡張機能で利用できるかどうかはわかりません。何が起こるかを試してみてください。これ以上続ける前に!;)
Chrome パッケージ アプリと WebRTC:
ただし、Chrome パッケージ アプリでは、サンドボックス化されたページとサンドボックス化されていないページの両方で可能です。Chrome パッケージ アプリは拡張機能と非常によく似ているため、実行する内容によっては、代わりにアプリを作成することをお勧めします。
Packaged Apps Manifest Permissions Documentationでは、「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});
});
メインページはポップアップウィンドウにする必要があります。私のセットアップでは、mainpage.html 内に call.htm という iframe があり、iframe ページはサンドボックス化されているため、通常の Web ページとしてしか実行できない安全でない操作を実行できます。ただし、サンドボックス化されていないポップアップで getUserMedia コマンドを実行すると、webkitGetUserMedia への呼び出しから MediaStream オブジェクトを取得します。
navigator.webkitGetUserMedia({ audio: true, video: true },
function (stream) {
mediaStream = stream;
},
function (error) {
console.error("Error trying to get the stream:: " + error.message);
});
テストしたところ、ポップアップでビデオをキャプチャできました。
@tsbarnes が示唆するように、ハックがありますが、Chrome アプリの場合はハックが異なります。background.js
代わりに、次のようなものから navigator.webkitGetUserMedia を呼び出します。
navigator.webkitGetUserMedia({audio: true, video: true}, function() {
console.log('ok');
}, function(e) {
console.log('webcam not ok');
});
そして、window.html またはその他の webview から引き続きオーディオ/ビデオにアクセスできます。
機能navigator.webkitGetUserMedia
するように求めることはできますが、新しいタブでポップアップをoptions.js
開く必要があります。そうしないと、エラーが発生するため、書き込む必要がありますoption.html
manifest.json
"options_ui": {
"page": "options.html",
"chrome_style": true,
"open_in_tab": true
}