MediaPlayer使用R.raw音频

时间:2018-06-03 08:44:04

标签: android android-mediaplayer

我制作的音频播放器应用会从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()

1 个答案:

答案 0 :(得分:1)

原因是您无法在API 26之后在后台启动服务。因此,您必须在API 26之上启动ForegroundService。