我有一个使用 ExoPlayer 播放音频的应用程序。现在,我正在努力添加对 Android Auto 的支持。但是,在添加自定义操作以支持快退和快进之后,当我在 Android Auto 的应用程序中播放媒体项目时,UI 就没有响应了。
private class MediaControllerCallback : MediaControllerCompat.Callback() {
override fun onPlaybackStateChanged(state: PlaybackStateCompat?) {
if (audioServiceViewModel.isPlaying)
setupPlaybackControls(state)
}
private val mediaSessionCallback = object : MediaSessionCompat.Callback() {
override fun onPlay() {
exoPlayer.play()
}
override fun onPause() {
exoPlayer.pause()
}
override fun onRewind() {
exoPlayer.seekTo(exoPlayer.currentPosition - 30000)
}
override fun onFastForward() {
exoPlayer.seekTo(exoPlayer.currentPosition + 30000)
}
override fun onCustomAction(action: String?, extras: Bundle?) {
when (action) {
CUSTOM_ACTION_REWIND -> onRewind()
CUSTOM_ACTION_FAST_FORWARD -> onFastForward()
}
}
}
private fun setupPlaybackControls(state: PlaybackStateCompat?) {
val playbackState = state?.state ?: PlaybackStateCompat.STATE_NONE
val capabilities = (PlaybackStateCompat.ACTION_PLAY_PAUSE
or PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PAUSE
or PlaybackStateCompat.ACTION_SEEK_TO)
val rewindBuilder =
PlaybackStateCompat.CustomAction.Builder(CUSTOM_ACTION_REWIND, "rewind", R.drawable.replay_30).build()
val fastForwardBuilder =
PlaybackStateCompat.CustomAction.Builder(
CUSTOM_ACTION_FAST_FORWARD,
"fast_forward",
R.drawable.forward_30
).build()
val stateBuilder = PlaybackStateCompat.Builder().apply {
setActions(capabilities)
setState(playbackState, exoPlayer.currentPosition, exoPlayer.playbackParameters.speed)
addCustomAction(rewindBuilder)
addCustomAction(fastForwardBuilder)
}.build()
mediaSession.setPlaybackState(stateBuilder)
}
}
我发现以下行可能是导致 UI 无响应的原因:
setState(playbackState, exoPlayer.currentPosition, exoPlayer.playbackParameters.speed)
如果我去掉这一行,选择一个媒体项播放后,它不能进入播放视图。
有些媒体项目甚至无法开始播放,卡在“正在选择...”。
从日志中,我得到以下错误:
!!!FAILED BINDER TRANSACTION!!! Package enqueue rate is 23.630941. Shedding 0.
该应用程序甚至崩溃了
DeadObjectException
.
我还在测试一个示例 Android Auto 媒体应用程序。它正在使用 Exoplayer
v2.14.2
。当我将版本更新到v2.15.0
时,DeadObjectException
崩溃发生了。这是否意味着自 v2.15.0
以来 ExoPlayer 发生了变化,导致了我遇到的问题?
有没有人遇到同样的问题?有什么建议吗?
当在进程之间传输的数据超过最大大小限制时会发生此错误,在 Android 中为 1MB。 在这种情况下,可能是在 Android Auto 服务和您的应用程序之间传输的数据超过了此限制,并且因为其中交易失败。
一个可能的解决方案是减少进程之间传输的数据量。您可以尝试减小元数据的大小或删除您添加的一些自定义操作。
此外,另一种解决方案是使用不同的方法来处理自定义操作。您可以使用 PendingIntent 单独发送动作,而不是将动作作为 PlaybackStateCompat 对象的一部分发送。这有助于减少传输的数据量,并有助于避免活页夹交易问题 :) .
关于ExoPlayer版本的问题,可能是新版本的ExoPlayer发生变化导致DeadObjectException崩溃。您可以尝试使用旧版本的 ExoPlayer 来查看问题是否消失。或者,您可以尝试通过查看日志和堆栈跟踪来确定问题的根本原因,从而使用较新版本的 ExoPlayer 来调试问题。
希望这对您有所帮助 :)