Chromecast Android Sender RemoteMediaPlayer生成无当前媒体会话

时间:2014-03-08 18:44:25

标签: android session chromecast sender

我已经能够成功地将视频投射到Chromecast,并且可以在断开连接时让视频播放,这一切都很有效。但是,如果我选择退出应用程序并让视频继续播放,然后尝试重新加入当前正在播放的会话并尝试使用RemoteMediaPlayer来控制我得到的视频:“java.lang.IllegalStateException:No current media会话”。

作为背景,我将路由ID和会话ID保存在初始连接到首选项中,并且能够成功调用“Cast.CastApi.joinApplication”,并且在onResult中我正在重新创建媒体通道并设置setMessageReceivedCallbacks如下:

Cast.CastApi.joinApplication(mApiClient,"xxxxxxxx",persistedSessionId).setResultCallback(new ResultCallback<Cast.ApplicationConnectionResult>() {
@Override
public void onResult(Cast.ApplicationConnectionResult applicationConnectionResult) {
    Status status = applicationConnectionResult.getStatus();
    if (status.isSuccess()) {
        mRemoteMediaPlayer = new RemoteMediaPlayer();
        mRemoteMediaPlayer.setOnStatusUpdatedListener(
        new RemoteMediaPlayer.OnStatusUpdatedListener() {
            @Override
            public void onStatusUpdated() {
                Log.d("----Chromecast----", "in onStatusUpdated");
            }
        });

        mRemoteMediaPlayer.setOnMetadataUpdatedListener(
        new RemoteMediaPlayer.OnMetadataUpdatedListener() {
            @Override
            public void onMetadataUpdated() {
                Log.d("----Chromecast----", "in onMetadataUpdated");
            }
        });

        try {
            Cast.CastApi.setMessageReceivedCallbacks(mApiClient,mRemoteMediaPlayer.getNamespace(),      mRemoteMediaPlayer);
        } catch (IOException e) {
           Log.e("----Chromecast----", "Exception while creating media channel", e);
        }


        //-----------RESOLUTION START EDIT------------------
        mRemoteMediaPlayer.requestStatus(mApiClient).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() {
            @Override
            public void onResult(RemoteMediaPlayer.MediaChannelResult mediaChannelResult) {
                Status stat = mediaChannelResult.getStatus();
                if(stat.isSuccess()){
                    Log.d("----Chromecast----", "mMediaPlayer getMediaStatus success");
                    // Enable controls
                }else{
                    Log.d("----Chromecast----", "mMediaPlayer getMediaStatus failure");
                    // Disable controls and handle failure
                }
            }
        });
        //-----------RESOLUTION END EDIT------------------


    }else{
        Log.d("----Chromecast----", "in status failed");
    }
}
}

如果我将RemoteMediaPlayer声明为静态:

private static RemoteMediaPlayer mRemoteMediaPlayer;

我可以加入现有会话,也可以使用以下命令控制媒体:

mRemoteMediaPlayer.play(mApiClient);

mRemoteMediaPlayer.pause(mApiClient);

但是一旦我退出应用程序,显然静态对象被破坏,应用程序产生上述“无当前媒体会话”异常。我肯定错过了一些东西,因为在我加入会话并注册回调后,我可能需要启动会话,就像我最初使用mRemoteMediaPlayer.load(。

加载媒体时创建的那样)。

有人可以帮助,因为这非常令人沮丧吗?

2 个答案:

答案 0 :(得分:1)

媒体会话ID是RemoteMediaPlayer对象内部状态的一部分。只要接收者状态发生变化,它就会向发送者发送更新的状态信息,然后导致RemoteMediaPlayer对象的内部状态得到更新。

如果断开与应用程序的连接,则RemoteMediaPlayer中的此状态将被清除。

当您重新建立与(仍在运行的)接收器应用程序的连接时,您需要调用RemoteMediaPlayer.requestStatus()并等待OnStatusUpdatedListener.onStatusUpdated()回调。这将从接收器获取当前媒体状态(包括当前会话ID)并相应地更新RemoteMediaPlayer对象的内部状态。完成此操作后,如果RemoteMediaPlayer.getMediaStatus()返回非null,则表示存在可以控制的活动媒体会话。

答案 1 :(得分:1)

正如user3408864指出的,重新加入会话后的requestStatus()有效。以下是我在我的案例中设法解决它的方法,它应该适用于你的。

     if(MAIN_ACTIVITY.isConnected()){

            if(MAIN_ACTIVITY.mRemoteMediaPlayer == null){
                MAIN_ACTIVITY.setRemoteMediaPlayer();
            }

            MAIN_ACTIVITY.mRemoteMediaPlayer.requestStatus(MAIN_ACTIVITY.mApiClient).setResultCallback( new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() {
                @Override 
                public void onResult(RemoteMediaPlayer.MediaChannelResult mediaChannelResult) {
                    if(playToggle ==0){

                        try {
                            MAIN_ACTIVITY.mRemoteMediaPlayer.pause(MAIN_ACTIVITY.mApiClient);
                            playToggle =1;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }else{

                        try {
                            MAIN_ACTIVITY.mRemoteMediaPlayer.play(MAIN_ACTIVITY.mApiClient);
                            playToggle =0;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                }
            });

        }

忽略,MAIN_ACTIVITY,它只是我的活动的静态引用,因为我从服务运行这段代码。此外,setRemoteMediaPlayer()是一种方法,我创建一个新的RemoteMediaPlayer()并附加相应的监听器。

希望这会有所帮助。另外,对不起,如果有任何错误,这是我第一次发布到StackOverFlow。