Android Auto 中的媒体应用程序自定义操作使播放视图无响应

问题描述 投票:0回答:1

我有一个使用 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 exoplayer android-auto
1个回答
0
投票

当在进程之间传输的数据超过最大大小限制时会发生此错误,在 Android 中为 1MB。 在这种情况下,可能是在 Android Auto 服务和您的应用程序之间传输的数据超过了此限制,并且因为其中交易失败。

一个可能的解决方案是减少进程之间传输的数据量。您可以尝试减小元数据的大小或删除您添加的一些自定义操作。

此外,另一种解决方案是使用不同的方法来处理自定义操作。您可以使用 PendingIntent 单独发送动作,而不是将动作作为 PlaybackStateCompat 对象的一部分发送。这有助于减少传输的数据量,并有助于避免活页夹交易问题 :) .

关于ExoPlayer版本的问题,可能是新版本的ExoPlayer发生变化导致DeadObjectException崩溃。您可以尝试使用旧版本的 ExoPlayer 来查看问题是否消失。或者,您可以尝试通过查看日志和堆栈跟踪来确定问题的根本原因,从而使用较新版本的 ExoPlayer 来调试问题。

希望这对您有所帮助 :)

© www.soinside.com 2019 - 2024. All rights reserved.