首页 > 解决方案 > 如何正确跟踪播放位置?[Android 媒体广播通知 Spotify API]

问题描述

在阅读了关于 Spotify 的 Android 媒体通知 API 的文档https://beta.developer.spotify.com/documentation/android-sdk/guides/android-media-notifications/后,我成功地接收到通知元数据并显示出来在我的应用程序上正确。

但是,通知元数据仅在队列更改、轨道更改和播放更改时更新,因此除非发生这三个操作之一,否则不会发送额外的“positionInMs”意图。

到目前为止,作为一种解决方法,我只是使用发送意图的时间、最后一个已知的播放位置和跟踪当前播放位置的轨道持续时间来启动一个计时器。

起初这似乎可行,但经过进一步测试后,我意识到如果用户正在收听的曲目由于互联网连接缓慢而冻结,我设置的计时器可能会不同步。

有什么想法可以正确跟踪播放位置,同时考虑到缓慢的互联网连接?或者有什么我应该研究的替代方案吗?

标签: androidapiandroid-intentbroadcastreceiverspotify

解决方案


我知道这个问题已经很老了,但是如果其他人遇到它,我无论如何都会回答。

我建议不断查询 Spotify 以获取播放位置。您可以做到这一点的一种方法是使用计时器并在每个给定时间范围内查询 Spotify。下面的示例每 100 毫秒查询一次 Spotify。如果您想减少/增加查询次数,您可以简单地使用 stopwatch.setClockDelay() 并提供您需要的时间

例如,您可以使用这个计时器库

    implementation 'com.yashovardhan99.timeit:timeit:1.2.0'

然后使用以下代码:

   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.spotify);

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.setOnTickListener(this);
    stopwatch.start();

   }

    @Override
    public void onTick(Stopwatch stopwatch) {
    Data.getAndroidSpotifyAppRemote().getPlayerApi().getPlayerState().setResultCallback(new CallResult.ResultCallback<PlayerState>() {
        @Override
        public void onResult(PlayerState playerState) {
           Log.d("TAG", playerState.playbackPosition);
        }
    });

}

不要忘记在类的顶部添加以下代码:

implements Stopwatch.OnTickListener

推荐阅读