2 votes

MediaPlayer se plante lors du setDataSource avec l'audio R.raw

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()

1voto

Hasib Akter Points 3290

La raison en est que vous ne pouvez plus lancer de services en arrière-plan après avoir API 26 . Vous devez donc lancer ForegroundService à partir de l'API 26.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X