我已经能够成功地将视频投射到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(。
加载媒体时创建的那样)。有人可以帮助,因为这非常令人沮丧吗?
答案 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。