Android:如何在MediaBrowserService(Android Auto)显示当前播放队列项指示器
Android Auto 播放队列当前项指示器实现方案
要在Android Auto的播放队列中显示当前项的指示器,核心是结合MediaSession 状态管理和Car App Library 自定义界面来实现,以下是具体步骤:
1. 引入依赖(推荐使用Car App Library)
Android Auto现在推荐使用Car App Library进行定制化开发,替代旧版MediaBrowserService的有限适配能力,在模块的build.gradle中添加依赖:
implementation 'androidx.car.app:app:1.4.0' implementation 'androidx.car.app:media:1.4.0'
2. 正确维护MediaSession的播放队列与当前项
确保MediaSession始终同步播放队列和当前播放项的状态:
- 初始化或更新播放队列时,调用
mediaSession.setQueue(mediaItems),每个MediaItem需要设置唯一的mediaId和完整的MediaDescription - 播放切换时,调用
mediaSession.setCurrentMediaItem(currentMediaItem),同时更新播放状态:
val playbackState = PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_PLAYING, currentPosition, 1.0f) .build() mediaSession.setPlaybackState(playbackState)
3. 自定义播放队列界面添加指示器
默认的Android Auto媒体界面可能不显示自定义指示器,需要用Car App Library创建自定义列表模板,给当前播放项添加专属图标:
// 在CarAppService的会话回调中构建队列列表 override fun onCreateScreen(intent: Intent): Screen { return object : Screen(carContext) { override fun onGetTemplate(): Template { val queueRows = mutableListOf<Row>() val currentMediaId = mediaSession.controller.currentMediaItem?.mediaId // 遍历播放队列,为每个项创建列表行 mediaSession.controller.queue.forEach { queueItem -> val rowBuilder = Row.Builder() .setTitle(queueItem.description.title ?: "") .setSubtitle(queueItem.description.subtitle ?: "") // 给当前播放项添加指示器图标 if (queueItem.mediaId == currentMediaId) { val playingIcon = CarIcon.Builder( IconCompat.createWithResource(carContext, R.drawable.ic_playing_indicator) ).build() rowBuilder.setStartIcon(playingIcon) } queueRows.add(rowBuilder.build()) } // 构建列表模板 return ListTemplate.Builder() .setTitle("播放队列") .setSingleList(List.Builder().addAll(queueRows).build()) .build() } } }
4. 监听播放状态变化,实时更新界面
在MediaSession的回调中监听当前项切换,触发界面更新:
mediaSession.setCallback(object : MediaSessionCompat.Callback() { override fun onCurrentMediaItemChanged(mediaItem: MediaItemCompat?) { super.onCurrentMediaItemChanged(mediaItem) // 通知Car界面更新列表 screenManager.invalidate() } })
注意事项
- 指示器图标建议使用符合Android Auto设计规范的矢量图,尺寸适配车载屏幕
- 如果仍使用旧版MediaBrowserServiceCompat,可尝试通过
MediaBrowserServiceCompat.setQueue结合自定义通知栏队列,但自定义能力有限,推荐优先迁移到Car App Library
内容的提问来源于stack exchange,提问作者MacyMind
相关产品推荐
相关产品推荐

