如何正确跟踪播放位置? [Android媒体广播通知Spotify API]

时间:2018-05-04 17:17:03

标签: android api android-intent broadcastreceiver spotify

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

但是,通知元数据仅在队列更改时,轨道更改时以及更改播放时更新,因此,除非这三个操作中的一个发生,否则" positionInMs"意图额外没有被发送。

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

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

正确跟踪播放位置的任何想法,同时考虑到慢速的互联网连接?或者我有什么其他选择吗?

1 个答案:

答案 0 :(得分:2)

我知道这个问题已经很老了,但如果有人遇到它,我还是会回答。

我建议不断查询 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