自定义 chrome 扩展不启动设备列表

Posted

技术标签:

【中文标题】自定义 chrome 扩展不启动设备列表【英文标题】:Custom chrome extension not launching device list 【发布时间】:2014-03-02 03:09:39 【问题描述】:

我正在尝试从我正在编写的 chrome 扩展启动 cast api。当我在我的网络服务器上的常规旧 html 文件中运行相同的代码时,它运行良好。当我在扩展程序的弹出窗口中使用此代码时,它不起作用。在这种情况下, requestSession 调用根本不起作用,调用后似乎什么也没有发生。

我相信预期的行为是 google cast 扩展程序将显示设备列表弹出窗口。这是我的 javascript 和 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>

Javascript:

//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 调用之前关闭弹出窗口,但它仍然不起作用。有人有什么想法吗?

【问题讨论】:

您是否遇到任何错误?您是否尝试过在没有弹出窗口的情况下执行此操作? 没有任何错误。如果我只是打开 html 文件并尝试它,它工作正常。这肯定是导致问题的弹出窗口,但我不知道如何解决它。 我以前从来没有处理过chrome扩展,但是你怎么称呼弹出窗口呢?它是特定于 Chrome 扩展 API 还是像 alert() 这样的通用 javascript? 弹出窗口是当您单击工具栏中的扩展程序图标时显示的 html。因此,当您单击 google cast 扩展程序图标时,您会获得设备列表,即该扩展程序的弹出窗口。在扩展配置文件中,您只需定义要显示的 html 文件,我在上面给出了代码。 所以您无法从扩展程序自己的弹出窗口中打开 chrome cast 设备列表弹出窗口? 【参考方案1】:

不支持在 Chrome 扩展程序中调用 requestionSession API。这就是您无法获得设备列表的原因。

无论如何,此方法调用仅适用于常规网页,它会触发扩展程序以显示 Cast 设备的弹出窗口。这是它应该工作的唯一当前方式。

【讨论】:

有没有办法绕过它?除非明确禁止,否则我可以手动调用 cast_sender.js 文件中的某些方法以使 api 认为它正在标准页面上运行? 我正在考虑的另一种方法可能是执行用户脚本之类的操作,将脚本标记注入包含我的内容的页面,然后执行 api 调用。不幸的是,使用这种方法,chrome.cast 似乎是未定义的。 Chrome 扩展在页面的 javascript 和扩展的 javascript 之间是隔离的,但它们都共享相同的 DOM。也许,这就是您无法从扩展程序访问 chrome.cast 的原因。你能让这个工作吗?我被困在同一个地方,我能想到的一种可能的解决方案是使用 DOM 以某种方式从扩展 -> 页面 -> chromecast 传输消息

以上是关于自定义 chrome 扩展不启动设备列表的主要内容,如果未能解决你的问题,请参考以下文章

与 Host App 的自定义键盘扩展通信在设备中不工作但在模拟器中工作

如何从自定义键盘扩展启动包含应用程序?

javascript Chrome扩展程序将自定义javascript文件加载到标签的DOM中。

linux启动流程及自定义gurp

自定义扩展文件未在 iMessage 中打开

扩展 C# .NET 应用程序 - 是不是构建自定义脚本语言?