をonPlaybackStateChangedトリガされません、私は歌を開始し、それは2つの状態を経て取得する、最後の1は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);
}
}
};
これはこれはmLastPlayBackState.getPositionは、シークバーの後に新しい値を返すべき場所である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);
}
ですonPlaybackStateChangedが呼び出されないため常に0が返されます。なぜどんなアイデア?
解決方法が見つかりましたか? seekToが再生を開始するが、状態が更新されない同様の問題に直面しています。 – mobiledev
'Callback.onSeekTo'のコードは何ですか?あなたは 'mediaSession.setState()'をどこで呼びますか? – ianhanniballake