android - 如何正确跟踪播放位置?[Android 媒体广播通知 Spotify API]
问题描述
在阅读了关于 Spotify 的 Android 媒体通知 API 的文档https://beta.developer.spotify.com/documentation/android-sdk/guides/android-media-notifications/后,我成功地接收到通知元数据并显示出来在我的应用程序上正确。
但是,通知元数据仅在队列更改、轨道更改和播放更改时更新,因此除非发生这三个操作之一,否则不会发送额外的“positionInMs”意图。
到目前为止,作为一种解决方法,我只是使用发送意图的时间、最后一个已知的播放位置和跟踪当前播放位置的轨道持续时间来启动一个计时器。
起初这似乎可行,但经过进一步测试后,我意识到如果用户正在收听的曲目由于互联网连接缓慢而冻结,我设置的计时器可能会不同步。
有什么想法可以正确跟踪播放位置,同时考虑到缓慢的互联网连接?或者有什么我应该研究的替代方案吗?
解决方案
我知道这个问题已经很老了,但是如果其他人遇到它,我无论如何都会回答。
我建议不断查询 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
推荐阅读
- webpack-4 - webpack:使用 2 个入口文件时,两个文件都包含相同的 css - 有解决方法吗?
- angular - 无法读取 HTML 中未定义的属性“temp”,
- flutter - 将“多个”有状态和无状态小部件存储在一个 dart 文件中。没事吧?
- jsp - 如何在从oracle数据库获取的jsp页面中播放视频
- javascript - WebRTC 和 textTrack (caption) to Peer 是可能的吗?
- xml - 如何在 xslt 文件中正确使用 for-each?
- python - 如何从元组中删除括号(两边)?
- c++ - 读取 CSV 文件中的整数
- python - 将带有命令的电子邮件发送到其他电子邮件 discord.py
- java - 如何以给定的总和最佳地将多重集分配到子多重集中