Chromecast使用自定义接收器投射HTML对象

时间:2015-08-09 18:05:19

标签: android html chromecast google-cast custom-receiver

我正在开发Android应用,我需要将PDF文件发送到Chromecast,因此我决定使用返回HTML对象的PDF解码库。

//Load Images:
private void pdfLoadImages(final byte[] data)
{
    try
    {
        // run async
        new AsyncTask<Void, Void, String>()
        {
            // create and show a progress dialog
            ProgressDialog progressDialog = ProgressDialog.show(Prueba_PDF.this, "", "Opening...");

            @Override
            protected void onPostExecute(String html)
            {
                //after async close progress dialog
                progressDialog.dismiss();
                //load the html in the webview
                wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
            }

            @Override
            protected String doInBackground(Void... params)
            {
                try
                {
                    //create pdf document object from bytes
                    ByteBuffer bb = ByteBuffer.NEW(data);
                    PDFFile pdf = new PDFFile(bb);
                    //Get the first page from the pdf doc
                    PDFPage PDFpage = pdf.getPage(1, true);
                    //create a scaling value according to the WebView Width
                    final float scale = ViewSize / PDFpage.getWidth() * 0.95f;
                    //convert the page into a bitmap with a scaling value
                    Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
                    //save the bitmap to a byte array
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    page.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte[] byteArray = stream.toByteArray();
                    stream.reset();
                    //convert the byte array to a base64 string
                    String base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
                    //create the html + add the first image to the html
                    String html = "<!DOCTYPE html><html><body bgcolor=\"#b4b4b4\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
                    //loop though the rest of the pages and repeat the above
                    for(int i = 2; i <= pdf.getNumPages(); i++)
                    {
                        PDFpage = pdf.getPage(i, true);
                        page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
                        page.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        byteArray = stream.toByteArray();
                        stream.reset();
                        base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
                        html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
                    }
                    stream.close();
                    html += "</body></html>";
                    return html;

                }
                catch (Exception e)
                {
                    Log.d("error", e.toString());
                }
                return null;
            }
        }.execute();
        System.gc();// run GC
    }
    catch (Exception e)
    {
        Log.d("error", e.toString());
    }
}

是否可以使用sendMessage()方法将该HTML对象发送到Chromecast,以便在电视中显示已转换的PDF文件?我应该将message参数更改为html对象吗?

private void sendMessage(String message) {
    if (apiClient != null && mHelloWorldChannel != null) {
        try {
            Cast.CastApi.sendMessage(apiClient, mHelloWorldChannel.getNamespace(), message)
                    .setResultCallback(
                            new ResultCallback<Status>() {
                                @Override
                                public void onResult(Status result) {
                                    if (!result.isSuccess()) {
                                        Log.e(TAG, "Sending message failed");
                                    }
                                }
                            });
        } catch (Exception e) {
            Log.e(TAG, "Exception while sending message", e);
        }
    }
}

我正在使用Android版CastHelloText应用程序中的自定义接收器,但我担心这不符合我的需求。

<!--
Copyright (C) 2014 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE html>
<html>
  <head>
<style type="text/css">
  body {
    overflow:hidden;
  }
  div{
    height:720PX;
    width:1280PX;
    text-align:center;
    border:0px solid silver;
    display: table-cell;
    vertical-align:middle;
    color:#FFFFFF;
    background-color:#000000;
    font-weight:bold;
    font-family:Verdana, Geneva, sans-serif;
    font-size:40px;
}
</style>
<title>Cast Hello Text</title>
  </head>
  <body>
<DIV id="message">Talk to me</DIV>
<script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script>
<script type="text/javascript">
  window.onload = function() {
    cast.receiver.logger.setLevelValue(0);
    window.castReceiverManager = cast.receiver.CastReceiverManager.getInstance();
    console.log('Starting Receiver Manager');

    // handler for the 'ready' event
    castReceiverManager.onReady = function(event) {
      console.log('Received Ready event: ' + JSON.stringify(event.data));
      window.castReceiverManager.setApplicationState("Application status is ready...");
    };

    // handler for 'senderconnected' event
    castReceiverManager.onSenderConnected = function(event) {
      console.log('Received Sender Connected event: ' + event.data);
      console.log(window.castReceiverManager.getSender(event.data).userAgent);
    };

    // handler for 'senderdisconnected' event
    castReceiverManager.onSenderDisconnected = function(event) {
      console.log('Received Sender Disconnected event: ' + event.data);
      if (window.castReceiverManager.getSenders().length == 0) {
        window.close();
      }
    };

    // handler for 'systemvolumechanged' event
    castReceiverManager.onSystemVolumeChanged = function(event) {
      console.log('Received System Volume Changed event: ' + event.data['level'] + ' ' +
          event.data['muted']);
    };

    // create a CastMessageBus to handle messages for a custom namespace
    window.messageBus =
      window.castReceiverManager.getCastMessageBus(
          'urn:x-cast:com.google.cast.sample.helloworld');

    // handler for the CastMessageBus message event
    window.messageBus.onMessage = function(event) {
      console.log('Message [' + event.senderId + ']: ' + event.data);
      // display the message from the sender
      displayText(event.data);
      // inform all senders on the CastMessageBus of the incoming message event
      // sender message listener will be invoked
      window.messageBus.send(event.senderId, event.data);
    }

    // initialize the CastReceiverManager with an application status message
    window.castReceiverManager.start({statusText: "Application is starting"});
    console.log('Receiver Manager started');
  };

  // utility function to display the text message in the input field
  function displayText(text) {
    console.log(text);
    document.getElementById("message").innerHTML=text;
    window.castReceiverManager.setApplicationState(text);
  };
</script>

由于pdfLoadImages方法也将PDF页面作为图像返回,以这种方式发送PDF文件会更容易吗?

3 个答案:

答案 0 :(得分:1)

没有一种将HTML发送到Cast设备的显式方法。有一种方法可以向Cast设备发送文本消息,但这是为短消息设计的。您不应该使用它将任何其他内容发送到Cast设备。

接收方可以使用JavaScript动态地将URL从URL加载到DOM中。这可以像在桌面浏览器上包含一个框架一样,但您必须在Web服务器上托管HTML。您可以在移动设备上安装Web服务器,但应考虑性能和安全问题。

Chromecast设备资源有限,您不应发送任何可能需要大量内存或繁重CPU处理的内容。要显示PDF,您可能需要考虑使用Remote Display API。您必须在移动设备上呈现PDF,然后Cast协议才会在电视上呈现视图。

答案 1 :(得分:0)

这是Supported Media for Google Cast。此页面没有提及任何有关转换HTML内容的内容,但我知道一些支持PDF文件的转换应用程序执行以下操作:

  • 将PDF文件转换为JPEG格式(JPEDALPDFOne ...)
  • 投射JPEG文件(您有大量有关如何操作的教程和示例)

答案 2 :(得分:0)

我认为您应该在自定义接收器HTML代码上使用PDFJs。然后从发件人发送一些指令到加载/滚动/页面更改。我已经为我的一个应用程序要求做了同样的事情。