Je suis en train de créer une application de lecteur audio qui chargera des audios prédéfinis depuis l'intérieur de l'application. raw
dossier de ressources.
J'ai envoyé l'APK de test à quelques personnes pour qu'elles le testent, et cela a fonctionné dans 99% des cas. Mais ensuite, j'ai commencé à avoir des rapports de crash sur Crashlytics pour un seul appareil le OnePlus A5000
sous Android 8.1.0.
Le stacktrace sur crashlytics est le suivant :
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)
les noms des paquets ont été modifiés pour des raisons de confidentialité
Cela se produit presque chaque fois qu'il clique sur le bouton de lecture de l'élément sonore. Cela se produit également la première fois qu'il clique sur un élément sonore.
J'ai essayé de reproduire ce plantage sur certains appareils, qui ont tous une API <= 25, mais je n'ai pas réussi à le faire. Tous les appareils fonctionnent sans problème. Je n'ai aucune idée de la cause probable de cette erreur, ni même s'il s'agit d'un problème marginal ou s'il y a effectivement quelque chose qui ne va pas dans mon code.
C'est comme ça que je charge l'audio sur l'ordinateur. 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()