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 je reçois l'erreur suivante:
start called in state 0
et juste en dessous c'est
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.
Vous devez appeler mediaPlayer.start()
dans la méthode onPrepared
à l'aide d'un écouteur . Vous obtenez cette erreur car vous appelez mediaPlayer.start()
avant que l'état préparé ne soit atteint.
Voici comment vous pouvez le faire:
mp.setDataSource(url);
mp.setOnPreparedListener(this);
mp.prepareAsync();
public void onPrepared(MediaPlayer player) {
player.start();
}
Il semble que Erreur -38 signifie une exception d'état (comme l'indique le message d'erreur). Par exemple, si vous appelez start()
, avant que la chanson soit prête, ou lorsque vous appelez pause()
, même si la chanson ne joue pas du tout.
Pour résoudre ce problème, vérifiez l'état de mediaPlayer avant d'appeler les méthodes. Par exemple:
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
De plus, MediaPlayer envoie des messages d'événement. Même si vous n'avez pas besoin de l'événement préparé (bien que ce serait une bonne idée de ne pas démarrer la lecture avant le déclenchement de cet événement), vous devez définir un écouteur de rappel. Cela est également vrai pour les variables OnErrorListener
, OnCompletionListener
, OnPreparedListener
et OnSeekCompletedListener
(si vous appelez la méthode seek).
Les auditeurs peuvent être attachés simplement par
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// Do something. For example: playButton.setEnabled(true);
}
});
J'ai eu cette erreur lorsque j'essayais d'obtenir la position actuelle (MediaPlayer.getCurrentPosition ()) du lecteur multimédia alors que ce n'était pas dans l'état indiqué. J'ai contourné cela en gardant une trace de son état et en appelant uniquement la méthode getCurrentPosition () après que onPreparedListener soit appelé.
Ceci est mon code, testé et fonctionne bien:
package com.example.com.mak.mediaplayer;
import Android.media.MediaPlayer;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder
Button btnplay = (Button) findViewById(R.id.btnplay); //Play
btnplay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View vone) {
mpp.start();
}
});
Button btnpause = (Button) findViewById(R.id.btnpause); //Pause
btnpause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View vtwo) {
if (mpp.isPlaying()) {
mpp.pause();
mpp.seekTo(0);
}
}
});
}
}
j'ai testé ci-dessous le code. fonctionne bien
public class test extends Activity implements OnErrorListener, OnPreparedListener {
private MediaPlayer player;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
player = new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3");
player.setOnErrorListener(this);
player.setOnPreparedListener(this);
player.prepareAsync();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
player.release();
player = null;
}
@Override
public void onPrepared(MediaPlayer play) {
play.start();
}
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
return false;
}
}
J'ai rencontré le même problème il y a quelques jours. Mon MediaPlayer audio fonctionne correctement sur les appareils dotés d’une puissance de traitement élevée, mais pour les appareils lents, le lecteur multimédia n’a tout simplement pas été lu pendant un certain temps et de nombreux clients se sont plaints d’avoir été appelés dans un état incorrect par LogCat. Donc je l'ai résolu en appelant en mettant l'appel à start () , pause () , ... dans onPrepared () méthode de OnPreparedListener () as ci-dessous:
mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
........
mediaPlayer.start();
....
songControlBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
} else {
mediaPlayer.start();
}
}
});
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
............
}
});
}
});
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, appelez mediaPlayer.release () in onPause () .
Parfois, les fichiers sont codés d’une manière qu’Android ne peut pas décoder. Même certains fichiers mp4 ne peuvent pas être lus. S'il vous plaît essayez un format de fichier différent (.3gp sont lus la plupart du temps) et voyez ..
J'ai résolu les erreurs (-19,0) et (-38,0) en créant chaque fois un nouvel objet MediaPlayer avant de le lire, puis de le relâcher.
Avant :
void play(int resourceID) {
if (getActivity() != null) {
//Using the same object - Problem persists
player = MediaPlayer.create(getActivity(), resourceID);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
}
});
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
}
}
Après:
void play(int resourceID) {
if (getActivity() != null) {
//Problem Solved
//Creating new MediaPlayer object every time and releasing it after completion
final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
}
});
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
}
}
if(length>0)
{
mediaPlayer = new MediaPlayer();
Log.d("length",""+length);
try {
mediaPlayer.setDataSource(getApplication(),Uri.parse(uri));
} catch(IOException e) {
e.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.seekTo(length);
mediaPlayer.start();
}
});
mediaPlayer.prepareAsync();
J'ai aussi eu cette erreur que j'ai essayé avec onPreparedListener mais j'ai quand même eu 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. :)
<uses-permission Android:name="Android.permission.INTERNET" />
J'ai utilisé des exemples de codage pour mediaplayer. J'ai utilisé dans StreamService.Java
Méthode onCreate
String url = "http://s17.myradiostream.com:11474/";
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
C'était très frustrant. Donc, j'ai une solution qui fonctionne pour moi.
try {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(file.getAbsolutePath());
mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
});
}
});
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
Pour moi cela a fonctionné
mp.seekTo(0);
mp.start();
Vous obtenez ce message dans les journaux, car vous effectuez une opération non autorisée dans l'état actuel de votre instance MediaPlayer.
Par conséquent, vous devriez toujours enregistrer un gestionnaire d’erreur pour attraper ces choses (comme suggéré par @tidbeck).
Au début, je vous conseille de consulter la documentation de la classe MediaPlayer
et de comprendre ce que cela signifie avec états. Voir: http://developer.Android.com/reference/Android/media/MediaPlayer.html#StateDiagram
Votre erreur ici pourrait bien être l’une des plus communes, ont écrit les autres, mais en général, je jetterais un œil à la documentation indiquant quelles méthodes sont valables pour appeler dans quel état: http://developer.Android. com/référence/Android/media/MediaPlayer.html # Valid_and_Invalid_States
Dans mon exemple, il s'agissait de 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é.