J'essaie actuellement de concevoir une application simple qui diffuse une station de radio Internet. J'ai l'URL de la station et je configure le lecteur multimédia comme
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(URL);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Le programme ne plante pas lorsqu'il est émulé, mais rien ne joue et j'obtiens l'erreur suivante:
start called in state 0
et juste en dessous se trouve
Error (-38,0)
Est-ce que quelqu'un sait ce que cela signifie?
J'ai lu un peu sur ces erreurs d'état, mais je n'ai rien trouvé qui s'applique à mon projet.
android
android-mediaplayer
SmashCode
la source
la source
Réponses:
Vous devez appeler
mediaPlayer.start()
laonPrepared
méthode en utilisant un écouteur. Vous obtenez cette erreur car vous appelezmediaPlayer.start()
avant qu'il n'ait atteint l'état préparé.Voici comment vous pouvez le faire:
la source
Il semble que l'erreur -38 signifie une exception d'état (comme l'indique le message d'erreur). Par exemple, si vous appelez
start()
, avant que la chanson ne soit prête, ou lorsque vous appelezpause()
, même si la chanson ne joue pas du tout.Pour résoudre ce problème, vérifiez l'état du mediaPlayer avant d'appeler les méthodes. Par exemple:
De plus, le MediaPlayer envoie des messages d'événement. Même si vous n'avez pas besoin de l'événement préparé (même si ce serait une bonne idée de ne pas démarrer la lecture avant que cet événement ne soit déclenché), vous devez définir un écouteur de rappel. Cela est également vrai pour le
OnErrorListener
,OnCompletionListener
,OnPreparedListener
etOnSeekCompletedListener
(si vous appelez la méthode seek).Les auditeurs peuvent être attachés simplement par
la source
J'ai eu cette erreur lorsque j'essayais d'obtenir la position actuelle (MediaPlayer.getCurrentPosition ()) du lecteur multimédia alors qu'elle n'était pas dans la position préparée. J'ai contourné cela en gardant une trace de son état et en n'appelant la méthode getCurrentPosition () qu'après l'appel de onPreparedListener.
la source
Ceci est mon code, testé et fonctionne bien:
la source
J'ai testé ci-dessous le code. fonctionne bien
la source
SetAudioStreamType(..)
utiliserSetAudioAttributes(...)
J'ai rencontré le même problème il y a quelques jours. Mon MediaPlayer audio fonctionne bien sur les appareils avec une puissance de traitement élevée, mais pour les appareils lents, le lecteur multimédia n'a tout simplement pas joué un certain temps et de LogCat, beaucoup se sont plaints d'appeler dans un état incorrect. J'ai donc résolu le problème en appelant l'appel à start () , pause () , ... dans la méthode onPrepared () de OnPreparedListener () comme ci-dessous:
Essayez également de libérer tout lecteur multimédia dont vous n'avez plus besoin. Par exemple, si vous ne souhaitez pas lire l'audio ou la vidéo en arrière-plan, vous devez appeler mediaPlayer.release () dans onPause () .
la source
Parfois, les fichiers sont encodés d'une manière qu'Android ne peut pas décoder. Même certains fichiers mp4 ne peuvent pas être lus. Veuillez essayer un autre format de fichier (.3gp sont lus la plupart du temps) et voir ..
la source
au-dessus de l'image, vous pouvez obtenir le bon chemin.
la source
Vous obtenez ce message dans les journaux, car vous faites quelque chose qui n'est pas autorisé dans l'état actuel de votre instance MediaPlayer.
Par conséquent, vous devez toujours enregistrer un gestionnaire d'erreurs pour attraper ces choses (comme @tidbeck l'a suggéré).
Dans un premier temps, je vous conseille de jeter un œil à la documentation de la
MediaPlayer
classe et de comprendre ce que cela signifie avec les états. Voir: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagramVotre erreur ici pourrait bien être l'une des plus courantes, les autres ont écrit ici, mais en général, je voudrais jeter un coup d'œil à la documentation sur les méthodes valides pour appeler dans quel état: http://developer.android.com/ reference / android / media / MediaPlayer.html # Valid_and_Invalid_States
Dans mon exemple, c'était la méthode
mediaPlayer.CurrentPosition
que j'ai appelée alors que le lecteur multimédia était dans un état où il n'était pas autorisé à appeler cette propriété.la source
J'ai résolu les erreurs (-19,0) et (-38,0), en créant un nouvel objet de MediaPlayer à chaque fois avant de jouer et en le relâchant après cela.
Avant :
}
Après:
}
la source
la source
C'était très frustrant. Donc, j'ai une solution qui fonctionne pour moi.
la source
Pour moi, cela a fonctionné
la source
J'ai également eu cette erreur que j'ai essayée avec onPreparedListener mais j'ai toujours cette erreur. Enfin, j'ai eu la solution que l'erreur est de ma faute parce que j'ai oublié l'autorisation Internet dans Android Manifest xml. :)
J'ai utilisé un exemple de codage pour Mediaplayer. J'ai utilisé dans la méthode StreamService.java
onCreate
la source
J'ai rencontré le même problème juste avant, l'ami du premier étage avait raison, vous avez appelé le
start()
au mauvais moment, vous devez définir un auditeur pour prepare () ouprepareSync()
avec cette méthodemediaPlayer.setOnPreparedListener(this)
; avant de se préparer, dans cet appel de rappelstart()
. Cela peut résoudre votre problème. J'ai déjà essayé.la source
Je suis nouveau dans la programmation Android et j'ai eu la même erreur que celle-ci. donc j'ai simplement redéfini le mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI). Ce n'est peut-être pas la vraie façon de procéder, mais cela a fonctionné avec une amende pour moi:
la source
la source