Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Base64编码图像作为字符串发送到Chromecast_Javascript_Android_Chromecast_Google Cast_Custom Receiver - Fatal编程技术网

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

Javascript 将Base64编码图像作为字符串发送到Chromecast,javascript,android,chromecast,google-cast,custom-receiver,Javascript,Android,Chromecast,Google Cast,Custom Receiver,问题是将本地图像以编码的Base64字符串的形式从手机发送到Chromecast。然后用我的自定义接收器解码。我遵循的指南是基于 我认为问题可能在于: 自定义接收器不合适(我不擅长JS) Chromecast没有加载那个接收器(我不知道如何检查) 图像在设备上编码错误或在Chromecast上解码 你看,似乎我对每一项都进行了正确编码,因为我发送照片时Chromecast的状态是: statusCode 0 (success), application name: Default Medi

问题是将本地图像以编码的Base64字符串的形式从手机发送到Chromecast。然后用我的自定义接收器解码。我遵循的指南是基于

我认为问题可能在于:

  • 自定义接收器不合适(我不擅长JS)
  • Chromecast没有加载那个接收器(我不知道如何检查)
  • 图像在设备上编码错误或在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();
        }
    }
    
    public void castImage(字符串编码图像)
    {
    Log.d(标记“castImage()”);
    String image_String=createJsonMessage(MessageType.image,encodedImage);
    sendMessage(图像\字符串);
    }
    私有静态字符串createJsonMessage(MessageType类型,字符串消息)
    {
    返回String.format(“{\'type\':\%s\',\'data\':\%s\'”),type.toString(),message);
    }
    /**
    *将图像转换为编码字符串
    * */
    公共字符串getEncodedImage(字符串路径){
    位图bm=BitmapFactory.decodeFile(路径);
    ByteArrayOutputStream bas=新的ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG,100,baos);//bm是位图对象
    字节[]byteArrayImage=baos.toByteArray();
    字符串encodedImage=Base64.encodeToString(byteArrayImage,Base64.DEFAULT);
    返回图像;
    }
    /**
    *向接收者发送文本消息
    *
    *@param消息
    */
    私有void发送消息(字符串消息){
    if(mApiClient!=null&&mCustomImageChannel!=null){
    试一试{
    Cast.CastApi.sendMessage(mApiClient,
    mCustomImageChannel.getNamespace(),消息)
    .setResultCallback(新的ResultCallback(){
    @凌驾
    公共结果无效(状态结果){
    如果(!result.issucess()){
    //始终到达此处:(
    Log.e(标记“发送消息失败”);
    }
    }
    });
    }捕获(例外e){
    日志e(标记“发送消息时异常”,e);
    }
    }否则{
    Toast.makeText(mContext、message、Toast.LENGTH\u SHORT)
    .show();
    }
    }
    
    如果发送过程是正确的,那么接收方是错误的,不知道如何正确解码此消息。 我上传它的方式(好吧,至少我认为它上传了…)

  • 在Google Cast控制台上注册了新的自定义接收器,并收到了应用程序ID
  • 创建了cast_receiver.js文件。该文件中的代码应该将Base64字符串解码为图像
  • 将Receiver的代码从guide复制到.js文件,并将其中的命名空间更改为my one:
    urn:x-cast:com.it.innovations.smartbus
  • 将文件上载到Google Drive,并修改其对公众的访问可见性
  • 已在Cast控制台中复制到URL字段。此链接是文件的直接下载
  • 重新启动Chromecast。它似乎试图下载一些东西,但不确定是否成功
  • 如果有人遇到这个问题,请指出我做错了什么。感谢任何帮助


    请说明是否需要更多的代码…

    I非常强烈地建议避免使用
    sendMessage()
    用于发送任何大型数据集;这些通道被用作控制通道,而不是发送数据块的方式。一种更简单、更可靠的方法是在本地应用程序(发送方)中嵌入一个小型哑web服务器并“服务”将图像发送到chromecast。有许多现成的嵌入式web服务器,您可以将其放入应用程序中,几乎不需要配置;然后,您甚至可以使用默认或样式的接收器将各种媒体(包括图像)发送到chromecast。

    谢谢您的回答!您所说的“将图像发送到chromecast”是什么意思?一些例子可以说明这一点。如果这是
    sendMessage()的一种替代方案
    我想了解它是如何工作的。您可以在手机应用程序中嵌入一个web服务器,并对其进行设置,以便您感兴趣的媒体可以通过该嵌入式web服务器访问。然后,您可以创建一个常规的MediaInfo,对于其URL,您可以指向web服务器为您的媒体提供的URL(例如,一个媒体项目可能通过您的嵌入式web服务器公开,url类似于“”,其中192.168.1.101是您家中wifi网络上手机的ip地址)。然后chromecast可以通过该url访问该内容,就像互联网上的任何其他内容一样。在这种情况下,图像将通过互联网而不是WiFi网络发送,对吗?chromecast基本上将下载而不是接收,不是吗?您的IP地址是WiFi网络上手机的本地地址,因此数据包不会离开您的本地WiFi网络好的,谢谢。如果没有人会提出更简单的解决方案,我会试试这个,并标记为答案