You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:53:01