将Base64编码的图像作为字符串发送到Chromecast

时间:2015-06-05 14:37:53

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

问题是将来自手机的本地图像作为编码的Base64字符串发送到Chromecast。并使用我的自定义接收器解码它。我正在关注基于thisthis project sample指南。

我建议问题可能在:

  1. 自定义接收器不合适(我在JS中不强)。
  2. Chromecast未加载该Receiver(我不知道如何检查)。
  3. 图片在设备上编码错误或在Chromecast上解码。
  4. 你知道,我发送照片的状态 后,似乎我编码正确,这是:

     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();
        }
    }
    

    如果发送过程正确,则接收器错误,不知道如何正确解码此消息。 我上传它的方式(好吧,至少我认为它上传了......)

    1. 在Google Cast控制台上注册了新的自定义接收器并收到了应用程序ID。
    2. 创建了cast_receiver.js文件。该文件中的代码应该将Base64字符串解码为图像。
    3. 将Receiver的代码从指南复制到.js文件,并将NAMESPACE内部更改为我的:urn:x-cast:com.it.innovations.smartbus
    4. 在Google云端硬盘上载文件,并将其访问权限修改为完全公开
    5. 在Cast控制台中将link to file复制到URL字段。此链接是直接下载文件。
    6. 重新启动Chromecast。好像它试图下载但不确定是否成功
    7. 如果有人遇到这个问题,请指出我做错了什么。感谢任何帮助。

      P.S。告诉我们是否需要更多代码...

1 个答案:

答案 0 :(得分:4)

非常强烈建议避免使用sendMessage()发送任何大型数据集;这些通道旨在用作控制通道,而不是用作发送大量数据的方式。一种更简单,更强大的方法是在您的本地应用程序(发送方)上嵌入一个微小的哑网服务器,并将您的图像“提供”给您的chromecast。您可以在应用程序中放置许多可立即使用的嵌入式Web服务器,几乎不需要配置;然后你可以使用默认或风格的接收器为你的chromecast提供各种媒体,包括图像。