我很好奇是否有人遇到过此问题或有任何建议。我正在编写一个媒体播放器,我正在使用MediaSessionCompat API。我经常确定播放媒体的当前位置并提出改变事件。我重新设置播放状态,如下所示。但是,由于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注意到状态已更改,这会重新发布当前位置到连接的蓝牙设备。
答案 0 :(得分:2)
蓝牙设备如何读取位置?我假设一些代码不断监视回放状态以获得当前位置?
为防止您不断更新PlaybackState
,播放状态包含计算流的近似当前位置所需的值。
设置playbackState时,您可以提供速度,当前位置和更新时间等值。
PlaybackState.Buider.setState(int state, long position, float playbackSpeed, long updateTime)
鉴于断言除非播放状态发生变化且当前正在播放,否则您可以从lastUpdate时间,速度和previousPosition计算currentPosition。
long timeDelta = SystemClock.elapsedRealtime() - lastPlaybackState.getLastPositionUpdateTime();
long currentPosition = (int) timeDelta * lastPlaybackState.getPlaybackSpeed();
你可以看看uAmp在FullScreenPlayerActivity中如何做到这一点。具体方法是updateProgress(..)