android - MediaStyle通知进度条在轨道暂停时不断前进API 30
问题描述
当我从通知中暂停时,进度条会继续前进,因为它仍在播放。如果我再次按下播放,进度条会回到最初暂停的位置并正确恢复。当我暂停时问题就来了:进度条没有停止并一直在前进。每次我的媒体播放器检测到播放状态更改时,我首先更新 PlaybackStateCompat,然后更新 MediaMetadataCompat,最后显示通知。在我们在 API 30 中运行应用程序之前,一切都以这种方式运行良好,该应用程序在扩展通知中具有进度条。在此图像中,播放状态为暂停,但进度条正在前进。
这就是我创建 PlaybackStateCompat.Builder 的方式。文档说您应该在暂停时将播放速度设置为 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;
}
解决方案
问题是方法 getPlaybackState 在调用时收到了错误的@PlaybackStateCompat.State。
推荐阅读
- c# - 由于我的 ASPX 文件之一,无法发布 ASP.NET 项目
- java - 问题 - 仅在一项活动上展示的横幅广告
- python - 使用 sklearn.linear_model.Ridge 的线性病态问题 - 描述训练数据的最佳方式?
- python - eval() 不接受关键字参数
- html - 如何使用超链接在我的页面上的 div 内显示外部页面?
- python - 计算列表中值的出现次数
- ios - 如何在 Xcode 12.4 上运行 iOS 模拟器 10.3.1?
- php - 如何显示所有“价格”乘以“金额”的数据?
- image-processing - 使用 imagemagick 进行 9 切片缩放?
- github - 如何在 github 页面上使用 jekyll 设置集合?