【问题标题】:remoteMediaPlayer.requestStatus(...) returns statusCode SIGN_IN_REQUIREDremoteMediaPlayer.requestStatus(...) 返回 statusCode SIGN_IN_REQUIRED
【发布时间】:2014-07-14 06:17:51
【问题描述】:

我有一个广播应用程序,可以在 Google Chromecast 上播放现场广播电台。使用 remoteMediaPlayer.load(...) 启动一个流就可以了。 但是remoteMediaPlayer.requestStatus(...) 稍后停止流说statusCode=SIGN_IN_REQUIRED 并抛出IllegalStateException: No current media session

为什么我无法停止正在播放的广播直播?或者如何停止 remoteMediaPlayer 播放?

实时广播流是 HTTP。这可能是问题吗?

这里有详细信息:

以下代码启动流并且它可以工作。

    MediaMetadata mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MUSIC_TRACK);
    mediaMetadata.putString(MediaMetadata.KEY_TITLE, stationName);
    mediaMetadata.addImage(new WebImage(Uri.parse(imageUrl)));
    final MediaInfo mediaInfo = new MediaInfo.Builder(stationUrl).setContentType("audio/mp3").setStreamType(MediaInfo.STREAM_TYPE_LIVE)
            .setMetadata(mediaMetadata).build();
    try {
        mRemoteMediaPlayer.load(apiClient, mediaInfo, true).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() {
            @Override
            public void onResult(MediaChannelResult result) {
                if (result.getStatus().isSuccess()) {
                    Utils.log(TAG, "Media loaded successfully: " + result.getStatus());
                } else {
                    Utils.log(TAG, "Media loaded NOT successfully: " + result.getStatus());
                }
            }
        });
    } catch .... {

以下代码停止流并且它不起作用。 结果是statusCode=SIGN_IN_REQUIREDjava.lang.IllegalStateException: No current media session

public static void stop() {
    try {
        mRemoteMediaPlayer.requestStatus(apiClient).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() {

            @Override
            public void onResult(RemoteMediaPlayer.MediaChannelResult mediaChannelResult) {
                Status status = mediaChannelResult.getStatus();
                Utils.log(TAG, "RemoteMediaPlayer requestStatus: Status=" + status.getStatus());
                try {
                    mRemoteMediaPlayer.stop(apiClient);
                } catch (Exception e) {
                    Log.e(TAG, "Exception while stopping GoogleApiClient. ", e);
                }
            }
        });
    } catch (IllegalStateException e) {
        Log.e(TAG, "Problem occurred while geting requestStatus", e);
    } catch (Exception e) {
        Log.e(TAG, "Exception while geting requestStatus. ", e);
    }
}

LogCat:

05-25 06:19:58.360: D/CastHelper(30561): RemoteMediaPlayer requestStatus: Status=Status{statusCode=SIGN_IN_REQUIRED, resolution=null}
05-25 06:19:58.360: E/CastHelper(30561): Exception while stopping GoogleApiClient. 
05-25 06:19:58.360: E/CastHelper(30561): java.lang.IllegalStateException: No current media session
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.internal.es.dC(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.internal.es.b(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.cast.RemoteMediaPlayer$4.a(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.cast.RemoteMediaPlayer$4.a(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.common.api.a$b.b(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.common.api.b.a(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.common.api.b.b(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.cast.RemoteMediaPlayer.stop(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.cast.RemoteMediaPlayer.stop(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.mydomain.myapp.CastHelper$8.onResult(CastHelper.java:97)
05-25 06:19:58.360: E/CastHelper(30561):    at com.mydomain.myapp.CastHelper$8.onResult(CastHelper.java:1)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.common.api.a$c.b(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at com.google.android.gms.common.api.a$c.handleMessage(Unknown Source)
05-25 06:19:58.360: E/CastHelper(30561):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-25 06:19:58.360: E/CastHelper(30561):    at android.os.Looper.loop(Looper.java:136)
05-25 06:19:58.360: E/CastHelper(30561):    at android.app.ActivityThread.main(ActivityThread.java:5579)
05-25 06:19:58.360: E/CastHelper(30561):    at java.lang.reflect.Method.invokeNative(Native Method)
05-25 06:19:58.360: E/CastHelper(30561):    at java.lang.reflect.Method.invoke(Method.java:515)
05-25 06:19:58.360: E/CastHelper(30561):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
05-25 06:19:58.360: E/CastHelper(30561):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
05-25 06:19:58.360: E/CastHelper(30561):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android google-play-services chromecast google-cast


    【解决方案1】:

    您是否有理由要使用stop 而不是pause?您可以调用stop,但请注意,调用stop 后,您需要重新附加媒体频道,然后加载下一个媒体,这就是为什么在这种情况下只使用pause 更方便。如果你想加载另一个流,你也不需要调用pause;只需在播放第一个媒体时加载第二个媒体就可以了。

    【讨论】:

    • pause 也是一种选择,但也不起作用。该错误甚至在暂停之前发生 - 在requestStatus。我发现load 对用户来说总是很好,但是在我第二次调用loadstatusCode=SIGN_IN_REQUIRED 之后看到的日志中。奇怪,因为实时流运行良好且不需要登录。为什么load 可以在不破坏应用程序的情况下工作,但pausestop 不起作用 - 即使它们都获得相同的状态SIGN_IN_REQUIREDstatusCode=SIGN_IN_REQUIRED 来自哪里?谢谢!
    【解决方案2】:

    toString() 并不是获取状态码的好方法。 RemoteMediaPlayer 有自己的一组 STATUS_* 代码。 SIGN_IN_REQUIRED 为 4,即 RemoteMediaPlayer.STATUS_REPLACED,表示您发出了与此请求相同类型的另一个请求。根据设计,RemoteMediaPlayer 只会跟踪每种类型的一个请求。例如,如果您在第一个 PAUSE 请求完成(即收到接收方的回复)之前发送一个 PAUSE,然后再发送另一个 PAUSE,它将停止跟踪第一个 PAUSE 并报告此错误。

    【讨论】:

    • 感谢您指出我“发出了另一个相同类型的请求”。我在应用程序的早期初始化了 RemoteMediaPlayer。在开始播放之前实例化 RemoteMediaPlayer 解决了我的问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多