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

Posted

技术标签:

【中文标题】如何正确跟踪播放位置? [Android 媒体广播通知 Spotify API]【英文标题】:How to properly track playback position? [Android Media Broadcast Notifications Spotify API] 【发布时间】:2018-10-15 05:55:59 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

我建议不断查询 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 媒体广播通知 Spotify API]的主要内容,如果未能解决你的问题,请参考以下文章

Android 编程 - 如何从广播接收器播放 SoundPool 声音?

android 媒体播放器 - mp3 http 广播流上的 PVMFFailure

如何在android中运行媒体扫描仪

如何一键播放和暂停 - Android

应用程序关闭后,用于媒体控件的 Android 广播接收器停止工作

Android中如何截获第三方媒体播放器中正在播放的音乐或视频的当前播放时间进度和总时间?求高手指点