2014-03-02 1 views
2

필자가 작성한 크롬 확장에서 캐스팅 API를 시작하려고합니다. 웹 서버의 일반 HTML 파일에서이 동일한 코드를 실행하면 완벽하게 작동합니다. 이 코드를 내 확장 프로그램의 팝업에서 사용할 때 작동하지 않습니다. 이 경우 requestSession 호출이 전혀 작동하지 않으며 호출 된 후에 아무 것도 발생하지 않습니다.사용자 지정 크롬 확장 장치가 시작되지 않음

예상되는 동작은 Google Cast 확장 프로그램이 기기 목록 팝업을 표시한다는 것입니다. 여기 내 자바 스크립트와 HTML입니다. 대부분은 CastHelloVideo-chrome에서 바로 복사됩니다.

HTML :

<html> 
<head> 
    <title>Popup</title> 
    <style> 
     body { 
      min-width:5px; 
      overflow-x:hidden; 
     } 
    </style> 
    <script type="text/javascript" src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script> 
</head> 
<body> 
    <button type="button" id="castButton">Cast!</button> 
</body> 
<script type="text/javascript" src="popup.js"></script> 
</html> 

자바 스크립트 :

//Constants 
var applicationID = "<App ID>"; 
var session; 
var currentMediaSession; 

/////////////////////////////////////////////////////////////////// 
//Chromecast API 
/////////////////////////////////////////////////////////////////// 

if (!chrome.cast || !chrome.cast.isAvailable) { 
    setTimeout(initializeCastApi, 1000); 
} 

function loadMedia() { 
    if (!session) { 
    console.log("no session"); 
    return; 
    } 
    var mediaInfo = new chrome.cast.media.MediaInfo('http://commondatastorage.googleapis.com/gtv-videos-bucket/big_buck_bunny_1080p.mp4'); 
    mediaInfo.contentType = 'video/mp4'; 
    var request = new chrome.cast.media.LoadRequest(mediaInfo); 
    request.autoplay = false; 
    request.currentTime = 0; 

    session.loadMedia(request, 
    onMediaDiscovered.bind(this, 'loadMedia'), 
    onMediaError); 

} 

/** 
* callback on success for loading media 
* @param {Object} e A non-null media object 
*/ 
function onMediaDiscovered(how, mediaSession) { 
    console.log("new media session ID:" + mediaSession.mediaSessionId); 
    currentMediaSession = mediaSession; 
} 

/** 
* callback on media loading error 
* @param {Object} e A non-null media object 
*/ 
function onMediaError(e) { 
    console.log("media error"); 
} 



////////////////////////////////////////////////////////////////// 
//UI 
////////////////////////////////////////////////////////////////// 
var castbutton = document.getElementById("castButton"); 
castButton.onclick=function(){ 
    window.close(); 
    chrome.cast.requestSession(onRequestSessionSuccess, onLaunchError); 
// loadMedia(); 
}; 


////////////////////////////////////////////////////////////////// 
//Helper Functions 
////////////////////////////////////////////////////////////////// 
function initializeCastApi() { 
    var sessionRequest = new chrome.cast.SessionRequest(applicationID); 
    var apiConfig = new chrome.cast.ApiConfig(sessionRequest, 
    sessionListener, 
    receiverListener); 
    chrome.cast.initialize(apiConfig, onInitSuccess, onError); 
} 

function sessionListener(e) { 
    console.log('New session ID: ' + e.sessionId); 
    session = e; 
} 

function receiverListener(e) { 
    console.log(e); 
} 

function onInitSuccess() { 
    console.log("init success"); 
} 

function onError() { 
    console.log("error"); 
} 

function onSuccess(message) { 
    console.log(message); 
} 

function onRequestSessionSuccess(e) { 
    session = e; 
    console.log("session created"); 
} 

function onLaunchError(e) { 
    console.log(e.description); 
} 

내가 내 확장의 팝업에서이 작업을 실행하기 위해 노력하고있어 때문에이 발생할 수 있습니다 생각합니다. Chrome에서 여러 플러그인이 동시에 표시되는 것을 허용하지 않습니다 (기기 목록은 Google Cast의 팝업입니다). requestSession 호출을 실행하기 전에 팝업을 닫으려고했지만 여전히 작동하지 않습니다. 누구든지 아이디어가 있습니까?

+0

오류가 있습니까? 팝업없이이 작업을 해본 적이 있습니까? – Charlie

+0

아무런 오류가 없습니다. html 파일을 열고 시도해도 문제가 없습니다. 분명히 문제의 원인이되는 팝업이지만 해결 방법을 모르겠습니다. – kilakev

+0

이전에는 크롬 확장 프로그램을 다루지 않았지만 어떻게 팝업 창을 부르니? Chrome 확장 API 또는 'alert()'와 같은 일반적인 자바 스크립트에만 해당됩니까? – Charlie

답변

0

Chrome 확장 프로그램 내에서 requestionSession API 호출을 호출하는 기능은 지원되지 않습니다. 그래서 장치 목록을 얻을 수 없습니다.

어쨌든이 메소드 호출은 일반 웹 페이지에서만 작동하며 확장 프로그램을 트리거하여 전송 장치의 팝업을 표시합니다. 이것이 현재 작동해야하는 유일한 방법입니다.

+0

어쨌든 나는 그것을 얻을 수 있습니까? 명시 적으로 금지되지 않는 한, cast_sender.js 파일에 API가 표준 페이지에서 실행되고 있다고 생각하도록 수동으로 호출 할 수있는 메소드가 있습니까? – kilakev

+0

내가 고려한 또 다른 방법은 사용자 스크립트와 같이 스크립트 태그를 내 콘텐츠가있는 페이지에 삽입 한 다음 API 호출을 실행하는 것입니다. 불행히도이 방법으로 chrome.cast는 정의되지 않은 것 같습니다. – kilakev

+0

Chrome 확장 프로그램은 페이지의 자바 스크립트와 확장 프로그램의 자바 스크립트간에 격리되어 있지만 둘 다 동일한 DOM을 공유합니다. 아마, 확장 기능에서 chrome.cast에 액세스 할 수없는 이유입니다. 이 일을 할 수 있었습니까? 나는 같은 장소에 붙어있어 내가 생각할 수있는 한 가지 가능한 해결책은 DOM을 사용하여 확장 프로그램에서 메시지를 전송하는 것입니다 -> 페이지 -> chromecast – Sathish