如何检测Android Auto启动时机以设置初始PlaybackState?
区分Android Auto系统触发与用户手动触发的播放请求
解决方案
通过
onPlay()的Bundle参数识别系统触发请求
Android Auto连接时触发的onPlay(),系统会传入带特定标识的Bundle。你可以检查android.media.session.EXTRA_RESTORE_FROM_MEDIA_CONTROLLER这个布尔值来区分:override fun onPlay(extras: Bundle?) { val isSystemTriggered = extras?.getBoolean( "android.media.session.EXTRA_RESTORE_FROM_MEDIA_CONTROLLER", false ) ?: false if (isSystemTriggered) { // 仅更新播放状态为暂停,不启动播放 updatePlaybackState(PlaybackStateCompat.STATE_PAUSED) } else { // 用户手动操作,正常启动播放 startPlayback() } }结合媒体浏览器连接状态判断
在MediaBrowserServiceCompat的onGetRoot()方法中,可通过客户端包名判断是否为Android Auto连接,设置全局标记:class YourMediaBrowserService : MediaBrowserServiceCompat() { private var isCarConnected = false override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot? { isCarConnected = clientPackageName == "com.google.android.projection.gearhead" return super.onGetRoot(clientPackageName, clientUid, rootHints) } override fun onPlay(extras: Bundle?) { val isSystemTriggered = extras?.getBoolean( "android.media.session.EXTRA_RESTORE_FROM_MEDIA_CONTROLLER", false ) ?: false if (isCarConnected && isSystemTriggered) { updatePlaybackState(PlaybackStateCompat.STATE_PAUSED) } else { startPlayback() } } }初始化时设置正确的播放状态
会话初始化时,若检测到车载连接,强制将初始播放状态设为暂停,忽略手机端上次的播放状态:private fun initMediaSession() { val initialState = if (isCarConnected) { PlaybackStateCompat.STATE_PAUSED } else { getLastPlaybackState() // 获取手机端上次保存的播放状态 } val playbackState = PlaybackStateCompat.Builder() .setState(initialState, 0, 1.0f) .setActions(PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PAUSE) .build() mediaSession.setPlaybackState(playbackState) }
注意:客户端包名可能因版本或厂商定制有所变动,优先结合
EXTRA_RESTORE_FROM_MEDIA_CONTROLLER的方式判断,准确性更高。
内容的提问来源于stack exchange,提问作者Dan Gravell
相关产品推荐
相关产品推荐

