Media Player llamado en estado 0, error (-38,0)

Actualmente estoy tratando de diseñar una aplicación simple que transmita una estación de radio por Internet. Tengo la URL de la estación y estoy configurando el reproductor multimedia como

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

El progtwig no se bloquea cuando se emula, pero no se reproduce nada y recibo el siguiente error:

 start called in state 0 

y justo debajo es

 Error (-38,0) 

Alguien sabe que significa esto?

He leído un poco sobre estos errores de estado, pero no pude encontrar nada que se aplique a mi proyecto.

    mediaPlayer.start() llamar a mediaPlayer.start() en el método onPrepared utilizando un oyente. mediaPlayer.start() este error porque está llamando a mediaPlayer.start() antes de que haya alcanzado el estado preparado.

    Aquí sabrás como podrás hacerlo :

     mp.setDataSource(url); mp.setOnPreparedListener(this); mp.prepareAsync(); public void onPrepared(MediaPlayer player) { player.start(); } 

    Parece que el error -38 significa una excepción de estado (como indica el mensaje de error). Por ejemplo, si llama a start() , antes de que la canción estuviera lista, o cuando llama a pause() , incluso si la canción no se está reproduciendo en absoluto.

    Para solucionar este problema, verifique el estado del mediaPlayer antes de llamar a los métodos. Por ejemplo:

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

    Además, MediaPlayer está enviando mensajes de evento. Incluso si no necesita el evento preparado (aunque sería una buena idea no iniciar la reproducción antes de que se desencadene este evento) debe configurar un callback-listener. Esto también es válido para OnErrorListener , OnCompletionListener , OnPreparedListener y OnSeekCompletedListener (si llama al método de búsqueda).

    Los oyentes se pueden conectar simplemente por

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

    Obtuve este error cuando estaba tratando de obtener la posición actual (MediaPlayer.getCurrentPosition ()) del reproductor multimedia cuando no estaba en el estado preparado. Lo solucioné haciendo un seguimiento de su estado y llamando solo al método getCurrentPosition () después de llamar a onPreparedListener.

    Este es mi código, probado y funcionando 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); } } }); } } 

    Algunas veces, los archivos están codificados de una manera que Android no puede decodificar. Incluso algunos archivos mp4 no se pueden reproducir. Pruebe con un formato de archivo diferente (.3gp se juega la mayor parte del tiempo) y vea …

    Probé a continuación el código. funcionando 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; } } 

    Me encontré con el mismo problema hace unos días. Mi MediaPlayer de audio funciona bien en dispositivos con alta potencia de procesamiento, pero para dispositivos lentos, el reproductor de medios simplemente no jugó un poco de tiempo y desde LogCat tuvo muchas quejas sobre llamadas en estado incorrecto. Así que lo resolví llamando al poner la llamada en start () , pause () , … en el método onPrepared () de OnPreparedListener () como se muestra a continuación:

     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) { ............ } }); } }); 

    También intente liberar cualquier reproductor multimedia que ya no necesite. Por ejemplo, si no desea reproducir el audio o video en segundo plano, debe llamar a mediaPlayer.release () en onPause () .

    Resolví ambos errores (-19,0) y (-38,0), creando un nuevo objeto de MediaPlayer cada vez antes de jugar y soltándolo después de eso.

    Antes de :

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

    }

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

    }

    Obtiene este mensaje en los registros, porque hace algo que no está permitido en el estado actual de su instancia de MediaPlayer.

    Por lo tanto, siempre debe registrar un controlador de errores para detectar esas cosas (como se sugirió @tidbeck).

    Al principio, te aconsejo que eches un vistazo a la documentación de la clase MediaPlayer y entiendas qué significa eso con states. Ver: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

    Su error aquí podría ser uno de los más comunes, los demás escribieron aquí, pero, en general, me gustaría echar un vistazo a la documentación de los métodos válidos para llamar en qué estado: http://developer.android.com/ reference / android / media / MediaPlayer.html # Valid_and_Invalid_States

    En mi ejemplo, era el método mediaPlayer.CurrentPosition , al que llamé mientras el reproductor multimedia estaba en un estado en el que no se permitía llamar a esta propiedad.

    También recibí este error, lo intenté con onPreparedListener pero aún así obtuve este error. Finalmente recibí la solución de que el error es mi culpa porque olvidé el permiso de Internet en Android Manifest xml. 🙂

      

    Usé la encoding de muestra para el reproductor multimedia. Utilicé en StreamService.java
    método onCreate

      String url = "http://s17.myradiostream.com:11474/"; mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); 
      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(); 

    Estaba muy frustrado. Entonces, obtuve una solución que funciona para mí.

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

    Para mí esto funcionó

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

    Me encontré con el mismo problema justo antes, el amigo en el primer piso tenía razón, llamó al start() en el momento equivocado, debe establecer un oyente para prepare () o prepareSync() con este método mediaPlayer.setOnPreparedListener(this) ; antes de preparar, en esta callback, start() . Puede resolver su problema. Ya lo he intentado.

     mp = new MediaPlayer(); AssetFileDescriptor afd = mContext.getAssets().openFd(fileName); mp.reset(); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); mp.prepare(); mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mp.start(); } }); mp.prepareAsync();