Android MediaSessionCompat.setPlaybackState不通知位置更改

tf7tbtn2  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(163)

我很好奇是否有人遇到过这个问题或者有什么建议。我正在编写一个媒体播放器,其中我使用了MediaSessionCompat API。我时常确定播放媒体的当前位置并引发一个change事件。我重新设置了播放状态,如下所示。但是,由于STATE_PLAYING状态没有改变,Android没有发出位置值更改的通知,特别是当我连接了显示当前位置的蓝牙设备时,蓝牙设备只在状态从STATE_PLAYING更改为STATE_PAUSED时接收位置,反之亦然。请参见下面的代码:

public void setup() {
    mediaSession = new MediaSessionCompat(context, Schema.TAG, component, pendingIntent);
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    mediaSession.setActive(true);
    updatePlaybackState();
}

public void updatePlaybackState() {
    int state = isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED;
    int ms = getCurrentPosition();
    mediaSession.setPlaybackState(new PlaybackStateCompat.Builder()
            .setState(state, ms, 1f)
            .build());
}

在这个例子中,当当前位置改变时,我调用updatePlaybackState,如果我如下改变updatePlaybackState方法,那么它将按预期工作;但我不确定我是否应该这么做。

public void updatePlaybackState() {
    int state = isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED;
    int ms = getCurrentPosition();
    mediaSession.setPlaybackState(new PlaybackStateCompat.Builder()
            .setState(PlaybackStateCompat.STATE_NONE, ms, 1f)
            .build());
    mediaSession.setPlaybackState(new PlaybackStateCompat.Builder()
            .setState(state, ms, 1f)
            .build());
}

如您所见,我将状态设置为STATE_NONE,然后将状态重新设置回STATE_PLAYING,以使Android注意到状态已更改,并将当前位置重新发布到连接的蓝牙设备。

bmp9r5qi

bmp9r5qi1#

蓝牙设备是如何读取位置的?我假设一些代码会不断地监视播放状态以获取当前位置?
为了避免不断更新PlaybackState,播放状态包含计算流的当前近似位置所需的值。
设置playbackState时,需要提供速度、当前位置和更新时间等值。
PlaybackState.Builder.setState(int state, long position, float playbackSpeed, long updateTime)
假定Assert除非播放状态发生更改并且当前正在播放,否则可以根据lastUpdate时间、速度和previousPosition计算currentPosition。

long timeDelta = SystemClock.elapsedRealtime() - lastPlaybackState.getLastPositionUpdateTime();
long currentPosition = (int) timeDelta * lastPlaybackState.getPlaybackSpeed();

大家可以在FullScreenPlayerActivity中看看uAmp是如何做到的,具体方法是updateProgress(..)

相关问题