我正在开发一个Android应用程序,我需要发送一个PDF文件到Chromecast,所以我决定使用一个PDF解码库返回一个HTML对象。
//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文件这种方式?
没有显式的方法将HTML发送到Cast设备。有一种向Cast设备发送短信的方法,但它是为短消息设计的。你不应该用它来发送任何其他内容到Cast设备。
接收者可以使用JavaScript动态地将HTML从URL加载到DOM中。这就像在桌面浏览器中包含一个框架一样,但是你必须在web服务器上托管HTML。你可以在你的移动设备上有一个web服务器,但你应该考虑性能和安全问题。
Chromecast设备的资源有限,您不应该发送任何可能需要大量内存或繁重CPU处理的内容。要显示PDF,您可能需要考虑使用Remote display API。您必须在移动设备上呈现PDF,然后Cast协议将在电视上呈现视图。
这是Google Cast支持的媒体。这个页面没有提到任何关于HTML内容的转换,但我知道一些支持PDF文件的转换应用程序会做以下事情:
- 将PDF文件转换为JPEG (JPEDAL, PDFOne…)
- 转换JPEG文件(你有很多关于如何做到这一点的教程和例子)
我认为您应该在自定义接收器html代码上使用PDFJs。然后发送一些指令到加载/滚动/页面更改从您的发送器。我已经为我的一个应用程序的要求做了同样的。