web-dev-qa-db-fra.com

Lecteur multimédia appelé à l'état 0, erreur (-38,0)

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.

92
SmashCode

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();
}
103
user1492955

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);
    }
});
29
Alexander Pacha

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é.

10
Fire in the Hole

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);
        }
      }
    });
  }
}
7
MAK

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;
}
}
3
Emran Hamza

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

3
Tony Vu

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 ..

3
Rukmal Dias

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

}

}

1
Saurabh Padwekar

enter image description here

au-dessus de l'image, vous pouvez obtenir le bon chemin.

0
Longalei
  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();
0
kamakshi

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();
0
B M

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();
                    }
0
Aman Srii

Pour moi cela a fonctionné

mp.seekTo(0);
mp.start();
0
Piyush Jajoo

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é.

0
SimonSimCity