Когда я делаю паузу в уведомлении, индикатор выполнения продолжает двигаться вперед, поскольку он все еще воспроизводится. Если я снова нажму кнопку воспроизведения, индикатор выполнения вернется в положение, в котором он был первоначально приостановлен, и возобновится правильно. Проблема возникает, когда я делаю паузу: индикатор выполнения не останавливается и продолжает двигаться. Каждый раз, когда мой медиаплеер обнаруживает изменение состояния воспроизведения, я сначала обновляю PlaybackStateCompat, затем обновляю MediaMetadataCompat и, наконец, показываю уведомление. Так все работало нормально, пока мы не запустили приложение в API 30, в расширенном уведомлении которого есть индикатор выполнения. На этом изображении состояние воспроизведения приостановлено, но индикатор выполнения продвигается вперед.
Вот как я создаю PlaybackStateCompat.Builder. В документации сказано, что во время паузы для параметра PlaySpeed следует установить значение 0, и именно это я и делаю.
@Override
public PlaybackStateCompat.Builder getPlaybackState(int typeMetadata, @PlaybackStateCompat.State int playbackStateCompact, MediaInfo mediaInfo,
long position) {
PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder();
switch (typeMetadata) {
case MetaDataType.MEDIAINFO:
stateBuilder.setActions(getIconButtons());
stateBuilder.setExtras(getPlaybackStateExtras(mediaInfo));
if (mediaInfo.getMediaType() == MediaInfo.MediaType.RADIO) {
stateBuilder.setState(playbackStateCompact, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 1.0f);
} else {
if (playbackStateCompact == PlaybackStateCompat.STATE_PAUSED) {
stateBuilder.setState(playbackStateCompact, position, 0.0f);
} else if (position == 0) {
stateBuilder.setState(playbackStateCompact, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 1.0f);
} else {
stateBuilder.setState(playbackStateCompact, position, 1.0f, SystemClock.elapsedRealtime());
}
}
return stateBuilder;
case MetaDataType.AD:
case MetaDataType.EMPTY:
stateBuilder.setActions(PlaybackStateCompat.ACTION_PREPARE);
stateBuilder.setBufferedPosition(0);
stateBuilder.setState(PlaybackStateCompat.STATE_BUFFERING, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 1);
break;
}
return stateBuilder;
}
Вот как я создаю MediaMetadataCompat.Builder
@Override
public MediaMetadataCompat.Builder getMediaCompact(int typeMetadata, MediaInfo mediaInfo) {
final MediaMetadataCompat.Builder mediaBuilder = new MediaMetadataCompat.Builder();
switch (typeMetadata) {
case MetaDataType.MEDIAINFO:
if (mediaBuilder != null) {
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, mediaInfo.getId());
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, mediaInfo.getTitle());
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, mediaInfo.getSubtitle());
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, mediaInfo.getAlbum());
mediaBuilder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, mediaInfo.getDuration());
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, ImageManager.getImageUrl(mediaInfo.getCoverPhoto()));
}
break;
case MetaDataType.AD:
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, "");
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, ApaManager.getInstance().getMetadata().getString("ad_title_banner"));
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "");
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, "");
mediaBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
BitmapFactory.decodeResource(MyApplication.getAppContext().getResources(), R.drawable.place_holder_playlists));
break;
case MetaDataType.EMPTY:
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, "");
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, "");
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "");
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, "");
mediaBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, "");
break;
}
return mediaBuilder;
}