觸發onPlaybackStateChanged我有這樣的媒體播放器和其他一切工作正常,我開始播放歌曲,它就會通過2個狀態,最後一個是PlaybackStateCompat.STATE_PLAYING
SeekTo不MediaControllerCompat
因此,我們可以說,回調被註冊。問題是每當我觸發SeekBar偵聽器,方法seekTo
不會觸發onPlaybackStateChanged
,因爲這沒有發生,我不能更新SeekBar到其新的進展。這隻涉及UI。在修改SeekBar進度後,音樂實際上是從進度播放。更重要的是,trackDurationTextView也不會更新。當我在搜索欄上拖動我的拇指時,它會改變它的值,但是一旦我釋放它,它會轉到它的初始進度,與搜索欄相同。
這裏是回調註冊的地方。
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
if (service instanceof MediaPlayerService.ServiceBinder) {
try {
mediaController = new MediaControllerCompat(this, ((MediaPlayerService.ServiceBinder) service).getService().getMediaSessionToken());
} catch (RemoteException e) {
e.printStackTrace();
}
mediaController.registerCallback(mMediaControllerCallback);
}
}
這是回調如何初始化:
private MediaControllerCompat.Callback mMediaControllerCallback = new MediaControllerCompat.Callback() {
@Override
public void onPlaybackStateChanged(@NonNull PlaybackStateCompat state) {
updatePlaybackState(state);
}
@Override
public void onMetadataChanged(MediaMetadataCompat metadata) {
if (metadata != null) {
updateMediaDescription(metadata.getDescription());
updateDuration(metadata);
}
}
};
這是OnSeekBarChangeListener
trackSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
trackDurationTextView.setText(DateUtils.formatElapsedTime(progress/1000));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
stopSeekbarUpdate();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//TODO: look here! the seek bar position is not kept when the user slides it!
mediaController.getTransportControls().seekTo(seekBar.getProgress());
scheduleSeekBarUpdate();
}
});
private void updateProgress() {
if (mLastPlaybackState == null) {
return;
}
long currentPosition = mLastPlaybackState.getPosition();
if (mLastPlaybackState.getState() != PlaybackStateCompat.STATE_PAUSED) {
// Calculate the elapsed time between the last position update and now and unless
// paused, we can assume (delta * speed) + current position is approximately the
// latest position. This ensure that we do not repeatedly call the getPlaybackState()
// on MediaControllerCompat.
long timeDelta = SystemClock.elapsedRealtime() -
mLastPlaybackState.getLastPositionUpdateTime();
currentPosition += (int) timeDelta * mLastPlaybackState.getPlaybackSpeed();
}
trackSeekBar.setProgress((int) currentPosition);
}
這是mLastPlayBackState.getPosition應搜索欄後返回新值的地方被更新,但它總是返回0,因爲onPlaybackStateChanged永遠不會被調用。任何想法爲什麼?
你能找到解決方案嗎?我正在面對一個類似的問題,即seekTo開始播放但狀態未更新。 – mobiledev
「Callback.onSeekTo」中的代碼是什麼?你在哪裏調用'mediaSession.setState()'? – ianhanniballake