我制作的音频播放器应用会从raw
资源文件夹中加载一些预定义的音频。
我已经将测试APK发送给某些人进行测试,并且它对99%的案例都有效。但后来,我开始在Crashlytics上获取一些关于单个设备的崩溃报告,OnePlus A5000
,运行Android 8.1.0。
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()
答案 0 :(得分:1)
原因是您无法在API 26
之后在后台启动服务。因此,您必须在API 26之上启动ForegroundService。