【问题标题】:Spotify: save playback state informationSpotify:保存播放状态信息
【发布时间】:2017-02-12 03:21:51
【问题描述】:

我正在根据这里的演示活动编写一个 android 应用程序:DemoActivity.java

我希望能够翻转 android 设备的屏幕(纵向到横向,反之亦然)并让用户保持登录状态并播放音乐。目前我能够让用户保持登录状态,但我被困在如何保存播放状态上。

在我的 onCreate 中:

if(savedInstanceState != null) {
        String accessToken = savedInstanceState.getString("accesstoken");
        Config player_Config = new Config(this, accessToken, CLIENT_ID);
        setPlayer(player_Config);
        mCurrentPlaybackState = savedInstanceState.getParcelable("playbackstate");
    }

我的 onSaveInstanceState:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString("accesstoken", accessToken);
    savedInstanceState.putParcelable("playbackstate", mCurrentPlaybackState);
    super.onSaveInstanceState(savedInstanceState);
}

我的 setPlayer(不包括身份验证,因为用户已经登录):

    public void setPlayer(Config player_Config) {
    Spotify.getPlayer(player_Config, this, new SpotifyPlayer.InitializationObserver() {

        @Override
        public void onInitialized(SpotifyPlayer spotifyPlayer) {
            myPlayer = spotifyPlayer;
            myPlayer.addConnectionStateCallback(HostPartyActivity.this);
            myPlayer.addNotificationCallback(HostPartyActivity.this);
            updateUIElements();
        }

        @Override
        public void onError(Throwable throwable) {
            Log.e("HostPartyActivity", "Could not initialize player: " + throwable.getMessage());
        }
    });
}

我的问题的示例情况:

  • 用户按下“登录”按钮并登录 Spotify 帐户
  • 用户按下“播放”按钮,开始播放 Spotify 曲目
  • 用户将设备从纵向翻转为横向
  • 应用程序自动登录基于用户的保存数据
  • Spotify 曲目停止播放(应在节省的时间继续播放)

感谢您的帮助。

【问题讨论】:

    标签: android spotify lifecycle


    【解决方案1】:

    经过一些研究,我想我已经弄清楚了如何保存必要的播放状态信息。 在我的 onCreate 中:

    if(savedInstanceState != null) { //restore instance
            accessToken = savedInstanceState.getString("accesstoken");
            if(accessToken != null) { //user was logged in
                Config player_Config = new Config(this, accessToken, CLIENT_ID);
                setPlayer(player_Config);
                /*
                * player is destroyed when new activity is started, so I need to get a new authentication code
                * for the new activity's player
                */
    
                myCurrentPlaybackState = savedInstanceState.getParcelable("playbackstate");
                myMetadata = savedInstanceState.getParcelable("metadata");
                if(myCurrentPlaybackState != null && myMetadata != null) { //user has played a song
                    myPlayer.playUri(myMetadata.currentTrack.uri, (int)myMetadata.currentTrack.indexInContext, (int)myCurrentPlaybackState.positionMs);
                }
            }
        }
    

    我的 onSaveInstanceState:

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putString("accesstoken", accessToken);
        if(myCurrentPlaybackState != null && myMetadata != null) {
            savedInstanceState.putParcelable("playbackstate", myCurrentPlaybackState);
            savedInstanceState.putParcelable("metadata", myMetadata);
        }
        super.onSaveInstanceState(savedInstanceState);
    }
    

    我的 setPlayer:

        public void setPlayer(Config player_Config) {
        myPlayer = Spotify.getPlayer(player_Config, this, new SpotifyPlayer.InitializationObserver() {
    
            @Override
            public void onInitialized(SpotifyPlayer spotifyPlayer) {
                myPlayer.addConnectionStateCallback(HostPartyActivity.this);
                myPlayer.addNotificationCallback(HostPartyActivity.this);
                updateUIElements();
            }
    
            @Override
            public void onError(Throwable throwable) {
                Log.e("HostPartyActivity", "Could not initialize player: " + throwable.getMessage());
            }
        });
    }
    

    使用此代码,通过翻转我的设备生成的新活动可以访问上一个活动的播放状态和元数据信息。但是,音乐曲目仍然不会在新活动中恢复播放,因为当旧活动被销毁时,它也会破坏播放器:

        @Override
    protected void onDestroy() {
        Spotify.destroyPlayer(this);
        super.onDestroy();
    }
    

    而且我无法重新访问这个经过身份验证的播放器,即使我使用与创建原始播放器相同的访问令牌创建了一个新播放器(错误:无法初始化播放器:播放器已关闭)。如何实现这一点是一个单独的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 2021-04-09
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多