Мне интересно, если кто-то столкнулся с этой проблемой или предложил какие-либо предложения. Я пишу медиаплеер, в котором я использую API MediaSessionCompat. Каждый так часто я определяю текущую позицию игрового носителя и поднимаю событие изменения. Я переустановил состояние воспроизведения, как показано ниже. Однако, поскольку состояние STATE_PLAYING
не изменяется, Android не повышает уведомление о том, что значение позиции изменилось. В частности, когда у меня подключено Bluetooth-устройство, которое отображает текущую позицию, устройство Bluetooth получает только позицию, когда состояние изменяется от STATE_PLAYING
до STATE_PAUSED
, или наоборот. Смотрите код ниже:Android MediaSessionCompat.setPlaybackState не уведомляет об изменениях позиции
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 заметить, что состояние изменилось, который повторно публикует текущую позицию подключенного Bluetooth устройство.
Спасибо за ответ. Устройство Bluetooth, которое я использую, это стерео в моей машине. Я предполагаю, что он только получает текущую позицию с устройства Android, если устройство Android сообщает ему, что такое текущая позиция. У меня есть поток, который запускается каждые 500 мс, подобно методу 'scheduleSeekbarUpdate()' в коде, который вы отправили для uAmp. Я, однако, спрашиваю MediaPlayer для 'getCurrentPosition()', а затем пытаюсь передать это значение на устройство bluetooth. – Nick
Фактически 'scheduleSeekbarUpdate()' просто вычисляет прошедшее время из последнего изменения воспроизведенияState и устанавливает значение на индикаторе выполнения. Таким образом, не нужно делать явный вызов для получения текущей позиции. Если состояние изменяется, запускается метод MediaController.Callback, который приводит к обновлению состояния воспроизведения и, следовательно, обновлению строки поиска. –
Правильно, моя проблема не определяет последнее положение строки поиска. Моя проблема заключается в уведомлении Bluetooth-устройства последней позиции. – Nick