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

标签 android api android-intent broadcastreceiver spotify

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

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

作为现在的解决方法,我只是使用发送 Intent 的时间、最后已知的播放位置和跟踪当前播放位置的跟踪持续时间来启动计时器。

一开始这似乎有效,但经过进一步测试,我意识到,如果用户正在收听的轨道由于互联网连接速度慢而卡住,我设置的计时器可能会不同步。

有什么想法可以在考虑互联网连接速度慢的情况下正确跟踪播放位置吗?或者我应该考虑其他替代方案吗?

最佳答案

我知道这个问题相当老了,但如果其他人遇到这个问题,我无论如何都会回答。

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

关于android - 如何正确跟踪播放位置? [Android 媒体广播通知 Spotify API],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180108/

相关文章:

java - 改进如何在 GET 中传递位置

javascript - 使用 Google map API 添加多个标记

mysql - 如何在 DreamFactory API 中创建存储过程

java - 在完成()之后从 Activity 中获取结果;在 Android 单元测试中

LinearLayouts 的 Android 画廊

android - TabLayout header 隐藏 fragment 中 ListView 上的第一项

android - 特定 Android Activity 的屏幕超时时间更长?

Android:尽管设置了 MIME 类型,但 PDF 文件仍隐藏

java - 短信管理器不工作。我还在 list 中包含了许可

android - 如何从另一个 Activity 调用一个 Activity 的功能