2015-06-23 3 views
2

Мне интересно, если кто-то столкнулся с этой проблемой или предложил какие-либо предложения. Я пишу медиаплеер, в котором я использую 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 устройство.

ответ

2

Как устройство Bluetooth считывает позицию? Я предполагаю, что какой-то код постоянно контролирует состояние воспроизведения, чтобы получить текущую позицию?

Чтобы предотвратить постоянное обновление PlaybackState, состояние воспроизведения содержит необходимые значения для вычисления приблизительной текущей позиции потока.

При настройке режима воспроизведенияState вы предоставляете такие значения, как скорость, текущая позиция и время обновления.

PlaybackState.Buider.setState(int state, long position, float playbackSpeed, long updateTime)

Учитывая утверждение, что если изменения состояния воспроизведения и она воспроизводится в данный момент, вы можете рассчитать currentPosition от lastUpdate времени, скорости и previousPosition.

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

Вы посмотрите на то, как uAmp делает это в FullScreenPlayerActivity может. Конкретный метод: updateProgress(..)

+0

Спасибо за ответ. Устройство Bluetooth, которое я использую, это стерео в моей машине. Я предполагаю, что он только получает текущую позицию с устройства Android, если устройство Android сообщает ему, что такое текущая позиция. У меня есть поток, который запускается каждые 500 мс, подобно методу 'scheduleSeekbarUpdate()' в коде, который вы отправили для uAmp. Я, однако, спрашиваю MediaPlayer для 'getCurrentPosition()', а затем пытаюсь передать это значение на устройство bluetooth. – Nick

+0

Фактически 'scheduleSeekbarUpdate()' просто вычисляет прошедшее время из последнего изменения воспроизведенияState и устанавливает значение на индикаторе выполнения. Таким образом, не нужно делать явный вызов для получения текущей позиции. Если состояние изменяется, запускается метод MediaController.Callback, который приводит к обновлению состояния воспроизведения и, следовательно, обновлению строки поиска. –

+0

Правильно, моя проблема не определяет последнее положение строки поиска. Моя проблема заключается в уведомлении Bluetooth-устройства последней позиции. – Nick

Смежные вопросы