124 votes

Media Player appelé à l'état 0, l'erreur (-38,0)

Je suis en train d'essayer de concevoir une application simple qui diffuse une station de radio internet. J'ai l'URL de la station et je suis de la configuration du Media Player par exemple

    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 n'est pas de la plante lorsque des émules, mais rien n'est jouer et je suis obtiens l'erreur suivante:

start called in state 0

et juste en dessous, il est

Error (-38,0)

Personne ne sait ce que cela signifie?

J'ai lu un peu au sujet de ces erreurs d'état, mais ne pouvait pas trouver quelque chose qui s'applique à mon projet.

137voto

user1492955 Points 375

Vous devez appeler mediaPlayer.start() dans la onPrepared méthode à l'aide d'un écouteur. Vous recevez ce message, car vous appelez mediaPlayer.start() avant qu'il ait atteint le prêt de l'état.

Voici comment vous pouvez le faire :

mp.setDataSource(url); 
mp.setOnPreparedListener(this);
mp.prepareAsync();

public void onPrepared(MediaPlayer player) {
    player.start();
}

38voto

Alexander Pacha Points 869

Il semble que l'Erreur -38 signifie un état d'exception (comme le message d'erreur indique). Par exemple, si vous appelez start(), avant que la chanson était prêt, ou lorsque vous appelez pause(), même si la chanson n'est pas jouer du tout.

Pour résoudre ce problème, vérifiez l'état de la mediaPlayer avant d'appeler les méthodes. Par exemple:

if(mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
}

En outre, le lecteur multimédia est l'envoi de l'événement-les messages. Même si vous n'avez pas besoin du prêt-événement (bien que ce serait une bonne idée de ne pas démarrer la lecture à l'avant de cet événement a été déclenché), vous devez configurer un rappel de l'auditeur. Cela est également vrai pour l' OnErrorListener, OnCompletionListener, OnPreparedListener et OnSeekCompletedListener (si vous appelez la méthode seek).

Les auditeurs peut être fixé simplement par

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // Do something. For example: playButton.setEnabled(true);
    }
});

13voto

MAK Points 41

C'est mon code,testé et fonctionne très 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;
    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);
                    }
                }
            });

    }
}

5voto

Emran Hamza Points 934

je l'ai testé le code ci-dessous. fonctionne très 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;
}
}

3voto

Rukmal Dias Points 1077

Quelques fois les fichiers sont encodés de façon que Android ne peut pas décoder. Même certains des fichiers mp4 ne peut pas être joué. Veuillez essayer un autre format de fichier (.3gp sont joué la plupart du temps) et de voir..

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