将 Base64 编码的图像作为字符串发送到 Chromecast
Send Base64 encoded image as string to Chromecast
问题是将来自 phone 的本地图像作为编码的 Base64 字符串发送到 Chromecast。并使用我的自定义接收器对其进行解码。我正在关注 this guide which is based on this project sample。
我认为问题可能出在:
- 自定义Receiver不合适(本人JS不强)
- Chromecast 没有加载该 Receiver(我不知道如何检查)。
- 图像在设备上编码错误或在 Chromecast 上解码错误。
你看,自从我发送照片时 Chromecast 的 状态是:
statusCode 0 (success),
application name: Default Media Receiver,
status: Ready To Cast,
sessionId: 34D6CE75-4798-4294-BF45-2F4701CE4782,
wasLaunched: true.
这就是我将图像作为字符串发送的方式:
mCastManager.castImage(mCastManager.getEncodedImage(currentEntryPictureByPoint.getPath()));
使用的方法:
public void castImage(String encodedImage)
{
Log.d(TAG, "castImage()");
String image_string = createJsonMessage(MessageType.image, encodedImage);
sendMessage(image_string);
}
private static String createJsonMessage(MessageType type, String message)
{
return String.format("{\"type\":\"%s\", \"data\":\"%s\"}", type.toString(), message);
}
/**
* Convert Image to encoded String
* */
public String getEncodedImage(String path){
Bitmap bm = BitmapFactory.decodeFile(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] byteArrayImage = baos.toByteArray();
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
return encodedImage;
}
/**
* Send a text message to the receiver
*
* @param message
*/
private void sendMessage(String message) {
if (mApiClient != null && mCustomImageChannel != null) {
try {
Cast.CastApi.sendMessage(mApiClient,
mCustomImageChannel.getNamespace(), message)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status result) {
if (!result.isSuccess()) {
//ALWAYS REACHING HERE :(
Log.e(TAG, "Sending message failed");
}
}
});
} catch (Exception e) {
Log.e(TAG, "Exception while sending message", e);
}
} else {
Toast.makeText(mContext, message, Toast.LENGTH_SHORT)
.show();
}
}
如果发送过程是正确的,那么接收者是错误的,不知道如何正确解码这条消息。
我上传它的方式(好吧,至少我认为它已上传...)
- 在 Google Cast Console 上注册了新的自定义接收器并收到了应用程序 ID。
- 已创建 cast_receiver.js 文件。此文件中的代码应该将 Base64 字符串解码为图像。
- 将 Receiver 的代码从指南复制到 .js 文件并将内部的 NAMESPACE 更改为我的:
urn:x-cast:com.it.innovations.smartbus
- 已将文件上传到 Google 驱动器并将其访问可见性修改为完全 public
- 已将 Cast Console 中的 link to file 字段复制到 URL 字段。这个link就是直接下载文件。
- 已重新启动 Chromecast。似乎它试图下载一些东西但不确定是否成功
如果有人遇到这个问题,请指出我做错了什么。感谢任何帮助。
P.S。告诉是否需要更多代码...
我非常强烈建议避免使用sendMessage()
发送任何大数据集;这些通道旨在用作控制通道,而不是作为发送大量数据的方式。一种更简单和更强大的方法是在您的本地应用程序(在发件人端)中嵌入一个微型网络服务器,并将您的图像 "serve" 嵌入到您的 chromecast 中。您可以将许多现成的嵌入式 Web 服务器放入您的应用程序中,并且几乎不需要任何配置;然后您可以使用默认或样式化的接收器向您的 chromecast 提供各种媒体,包括图像。
问题是将来自 phone 的本地图像作为编码的 Base64 字符串发送到 Chromecast。并使用我的自定义接收器对其进行解码。我正在关注 this guide which is based on this project sample。
我认为问题可能出在:
- 自定义Receiver不合适(本人JS不强)
- Chromecast 没有加载该 Receiver(我不知道如何检查)。
- 图像在设备上编码错误或在 Chromecast 上解码错误。
你看,自从我发送照片时 Chromecast 的 状态是:
statusCode 0 (success),
application name: Default Media Receiver,
status: Ready To Cast,
sessionId: 34D6CE75-4798-4294-BF45-2F4701CE4782,
wasLaunched: true.
这就是我将图像作为字符串发送的方式:
mCastManager.castImage(mCastManager.getEncodedImage(currentEntryPictureByPoint.getPath()));
使用的方法:
public void castImage(String encodedImage)
{
Log.d(TAG, "castImage()");
String image_string = createJsonMessage(MessageType.image, encodedImage);
sendMessage(image_string);
}
private static String createJsonMessage(MessageType type, String message)
{
return String.format("{\"type\":\"%s\", \"data\":\"%s\"}", type.toString(), message);
}
/**
* Convert Image to encoded String
* */
public String getEncodedImage(String path){
Bitmap bm = BitmapFactory.decodeFile(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] byteArrayImage = baos.toByteArray();
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
return encodedImage;
}
/**
* Send a text message to the receiver
*
* @param message
*/
private void sendMessage(String message) {
if (mApiClient != null && mCustomImageChannel != null) {
try {
Cast.CastApi.sendMessage(mApiClient,
mCustomImageChannel.getNamespace(), message)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status result) {
if (!result.isSuccess()) {
//ALWAYS REACHING HERE :(
Log.e(TAG, "Sending message failed");
}
}
});
} catch (Exception e) {
Log.e(TAG, "Exception while sending message", e);
}
} else {
Toast.makeText(mContext, message, Toast.LENGTH_SHORT)
.show();
}
}
如果发送过程是正确的,那么接收者是错误的,不知道如何正确解码这条消息。 我上传它的方式(好吧,至少我认为它已上传...)
- 在 Google Cast Console 上注册了新的自定义接收器并收到了应用程序 ID。
- 已创建 cast_receiver.js 文件。此文件中的代码应该将 Base64 字符串解码为图像。
- 将 Receiver 的代码从指南复制到 .js 文件并将内部的 NAMESPACE 更改为我的:
urn:x-cast:com.it.innovations.smartbus
- 已将文件上传到 Google 驱动器并将其访问可见性修改为完全 public
- 已将 Cast Console 中的 link to file 字段复制到 URL 字段。这个link就是直接下载文件。
- 已重新启动 Chromecast。似乎它试图下载一些东西但不确定是否成功
如果有人遇到这个问题,请指出我做错了什么。感谢任何帮助。
P.S。告诉是否需要更多代码...
我非常强烈建议避免使用sendMessage()
发送任何大数据集;这些通道旨在用作控制通道,而不是作为发送大量数据的方式。一种更简单和更强大的方法是在您的本地应用程序(在发件人端)中嵌入一个微型网络服务器,并将您的图像 "serve" 嵌入到您的 chromecast 中。您可以将许多现成的嵌入式 Web 服务器放入您的应用程序中,并且几乎不需要任何配置;然后您可以使用默认或样式化的接收器向您的 chromecast 提供各种媒体,包括图像。