gpt4 book ai didi

android - MediaPlayer 在带有 R.raw 音频的 setDataSource 上崩溃

转载 作者:行者123 更新时间:2023-11-29 01:01:42 24 4
gpt4 key购买 nike

我正在制作一个音频播放器应用程序,它将从其 raw 资源文件夹中加载一些预定义的音频。

我已经将测试 APK 发送给一些人进行测试,它在 99% 的情况下都有效。但随后,我开始在 Crashlytics 上收到一些针对单个设备(运行 Android 8.1.0 的 OnePlus A5000)的崩溃报告。

crashlytics 上的堆栈跟踪如下:

Fatal Exception: java.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(MediaPlayer.java)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1270)
at com.example.home.MediaPlayerHolder.loadMedia(MediaPlayerHolder.kt:56)
at com.example.home.HomePresenter.playSound(HomePresenter.kt:26)
at com.example.home.HomeFragment.onPlaySelected(HomeFragment.kt:178)
at com.example.home.SoundItemAdapter$ViewHolder$bind$1.onClick(SoundItemAdapter.kt:30)

出于隐私原因更改了程序包名称

几乎每次他单击声音项目播放按钮时都会发生这种情况。它也发生在他第一次点击任何声音项目时。

我试图在某些设备上重现此崩溃,所有设备的 API <= 25,但我没有成功。他们都毫无问题地跑了。我不知道这个错误的可能原因,或者即使它是一个边缘案例问题,或者如果我的代码确实有问题。

这就是我在 MediaPlayer 上加载音频的方式:

if (mediaPlayer?.isPlaying == true) {
mediaPlayer?.release()
mediaPlayer = null
}
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer()
}

val fileDescriptor = context.resources.openRawResourceFd(resource)
mediaPlayer?.setDataSource(fileDescriptor.fileDescriptor, fileDescriptor.startOffset, fileDescriptor.length)
fileDescriptor.close()
mediaPlayer?.prepare()
mediaPlayer?.start()

最佳答案

原因是在 API 26 之后您不能再在后台启动服务。所以你必须在API 26以上启动ForegroundService。

关于android - MediaPlayer 在带有 R.raw 音频的 setDataSource 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com