自定义 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 的自定义键盘扩展通信在设备中不工作但在模拟器中工作