gpt4 book ai didi

android - SeekTo 不会触发 MediaControllerCompat 中的 onPlaybackStateChanged

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:18 25 4
gpt4 key购买 nike

我有这个媒体播放器,其他一切正常,我开始播放歌曲,它经历了 2 个状态,最后一个是 PlaybackStateCompat.STATE_PLAYING

因此我们可以说回调已注册。问题是每当我触发 SeekBar 监听器时,方法 seekTo 都不会触发 onPlaybackStateChanged 并且因为这没有发生,所以我无法将 SeekBar 更新到它的新进度。这只涉及用户界面。音乐实际上是在修改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。有什么想法吗?

最佳答案

看来 MediaControllerCompat.Callback.onPlaybackStateChanged(PlaybackStateCompat state) 仅在 MediaSessionCompatPlaybackStateCompat 时被调用状态 改变。如果 PlaybackStateCompatposition 发生变化而 state 保持不变,则永远不会调用 onPlaybackStateChanged(...) .所以我假设“onPlaybackStateChanged”,API 更具体地指的是 PlaybackStateCompatstate 而不是 PlaybackStateCompat 本身。

为了解决这个问题,我暂时将 PlaybackStateCompatstate 更新为 PlaybackStateCompat.STATE_REWINDINGPlaybackStateCompat.STATE_FAST_FORWARDING 在 seek 命令之后触发 UI 上的 onPlaybackStateChanged(...) 以便我可以更新 SeekBar 的位置和耗时 TextView 的文本到新的播放位置。

更新:我无法再重现此问题。我也不确定我到底做了什么来修复它。我对您的第一个建议是验证您是否在 mediaSession 对象上调用 setState(state),其中 statePlaybackStateCompat 包含更新后的 position 值。这不是我的解决方案,但这是我首先要寻找的地方。

关于android - SeekTo 不会触发 MediaControllerCompat 中的 onPlaybackStateChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39719320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com