我很好奇是否有人遇到过这个问题或者有什么建议。我正在编写一个媒体播放器,其中我使用了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注意到状态已更改,并将当前位置重新发布到连接的蓝牙设备。
1条答案
按热度按时间bmp9r5qi1#
蓝牙设备是如何读取位置的?我假设一些代码会不断地监视播放状态以获取当前位置?
为了避免不断更新
PlaybackState
,播放状态包含计算流的当前近似位置所需的值。设置playbackState时,需要提供速度、当前位置和更新时间等值。
PlaybackState.Builder.setState(int state, long position, float playbackSpeed, long updateTime)
假定Assert除非播放状态发生更改并且当前正在播放,否则可以根据lastUpdate时间、速度和previousPosition计算currentPosition。
大家可以在FullScreenPlayerActivity中看看uAmp是如何做到的,具体方法是
updateProgress(..)