Android MediaSessionCompat.setPlaybackState不会通知位置更改

时间:2015-06-23 05:29:29

标签: android

我很好奇是否有人遇到过此问题或有任何建议。我正在编写一个媒体播放器,我正在使用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注意到状态已更改,这会重新发布当前位置到连接的蓝牙设备。

1 个答案:

答案 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(..)