使用适用于 Android 的 Spotify SDK 播放播放列表和曲目

Posted

技术标签:

【中文标题】使用适用于 Android 的 Spotify SDK 播放播放列表和曲目【英文标题】:Playing playlists and tracks with Spotify SDK for Android 【发布时间】:2016-08-01 00:26:36 【问题描述】:

我在让 Spotify 播放列表与 Beta 版 Spotify SDK 一起播放时遇到了一些问题。在某种程度上,我在使用 Spotify Player 类播放时关注this tutorial。但是,与示例不同的是,我想播放用户提供的曲目和播放列表,因此我必须收集用户曲目和播放列表数据,我已经使用 Kaaes android Web Wrapper 完成了这项工作。收集了我需要的数据后,我尝试构建 Spotify 播放器(这似乎构建得很好),然后从一个单独的方法中,尝试播放曲目或播放列表。有趣的是,只有在构建过程中调用它(就像在教程中一样)时,我才能播放曲目,但不能从其他方法调用,而且我根本无法播放播放列表。尝试播放以下内容的播放列表时出现错误:

com.spotify.sdk.android.player.NativeSpotifyException: Failed SpPlayUri with error code 5 (An unexpected argument value was passed to a function)

我传递给 play 方法的播放列表语法如下:

spotify:playlist:4vDeSXEwfHMYOuQaTtwlUK

类似于track的:

spotify:track:2TpxZ7JUBn3uw46aR7qd6V

当然,这可能是不正确的,但很难在网上找到如何在 Android SDK 上播放播放列表的示例。那么谁能告诉我如何播放播放列表以及如何在 Spotify Player 对象上播放内容,尤其是远离 Player 构建器?我将在下面提供我工作的一些相关部分。 FWIW,我正在处理来自另一个活动的身份验证,它还没有给我带来太多问题......

private PlayerState                         state;
private Player                              player;
...
public void buildPlayer()
    //start a Spotify player
    Config playerConfig = new Config(this, token, client_id);
    Spotify.getPlayer(playerConfig, this, new Player.InitializationObserver() 
        @Override
        public void onInitialized(Player p) 
            player = p;
            player.addPlayerNotificationCallback(SpotifyPlayer.this);
            player.setPlaybackBitrate(PlaybackBitrate.BITRATE_NORMAL);
            player.getPlayerState(new PlayerStateCallback() 
                @Override
                public void onPlayerState(PlayerState playerState) 
                    state = playerState;
                
            );
        
        @Override
        public void onError(Throwable throwable) 
            Log.e(ID, "Could not initialize player: " + throwable.getMessage());
        
    );


...
public void test()
    try 
        player.play("spotify:track:2TpxZ7JUBn3uw46aR7qd6V");
        //oddly enough, the track fails to play here, but not if I have this line in the builder
    catch (Exception e)
        System.out.println("player failed to play");
        e.printStackTrace();
    

这堂课还有更多内容,但现在这些都不应该干扰。我期待听到您的建议。

【问题讨论】:

【参考方案1】:

您收到该错误是因为您使用的 Spotify 播放列表的 URI 不正确。正确的格式是:

spotify:user:user_id:playlist:playlist_id

例如:

spotify:user:spotify:playlist:4hOKQuZbraPDIfaGbM3lKI

另一个问题是由于您仅在触发回调onInitialized 时才分配字段player,可能在您调用test 时字段player 仍然为空并且您得到@987654327 @。

像这样改变你的方法buildPlayer

public void buildPlayer()
    //start a Spotify player
    Config playerConfig = new Config(this, token, client_id);
    player = Spotify.getPlayer(playerConfig, this, new Player.InitializationObserver() 
        @Override
        public void onInitialized(Player p) 
            player.addPlayerNotificationCallback(SpotifyPlayer.this);
            player.setPlaybackBitrate(PlaybackBitrate.BITRATE_NORMAL);
            player.getPlayerState(new PlayerStateCallback() 
                @Override
                public void onPlayerState(PlayerState playerState) 
                    state = playerState;
                
            );
        
        @Override
        public void onError(Throwable throwable) 
            Log.e(ID, "Could not initialize player: " + throwable.getMessage());
        
    );

【讨论】:

是的,实际上我昨晚在查看有关播放列表的其他查询时发现了那部分。不过,我认为这是我最不担心的事情,因为我更担心的是一个奇怪的事实,即我无法播放超出buildPlayer()onInitialized() 部分范围的任何东西@ 我刚刚用onInitialized 问题的可能解决方案更新了我的答案。让我知道是否可以解决您的问题。 谢谢!我会尽快尝试并(如果我记得的话)回复您。 只是跟进,您的建议正是我想要的,感谢您的帮助。致敬,伙计!

以上是关于使用适用于 Android 的 Spotify SDK 播放播放列表和曲目的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spotify API 的 Android 应用程序仅在调试模式下工作

在 android 上的 spotify 中查找正在播放的歌曲

适用于 ios 的 Spotify API:从 ios spotify api 下载、保存、访问曲目

如何让 Spotify 和其他 Android 音乐应用根据意图进行搜索和播放?

适用于 iOS 的 Spotify SDK,如何清除 playerQueue

通过 Spotify API 在 skipToNext() 方法中使用回调