MediaPlayer error -38,0

Intento hacer un simple reproductor de radio en línea. Aquí está la dirección de la stream http://radio-electron.ru:8000/96 Aquí está mi código.

MyActivity.java

package com.example.untitled2; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.IOException; public class MyActivity extends Activity { MediaPlayer mediaPlayer; Button playButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); mediaPlayer = new MediaPlayer(); playButton = (Button)findViewById(R.id.button); playButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(mediaPlayer.isPlaying()) mediaPlayer.stop(); else { try { mediaPlayer.setDataSource(getApplicationContext(), Uri.parse("http://radio-electron.ru:8000/96")); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i2) { Toast.makeText(getApplicationContext(), "ERROR " + i, Toast.LENGTH_LONG).show(); playButton.setEnabled(false); Log.d("radio", "error " + i + " " + i2); return false; //To change body of implemented methods use File | Settings | File Templates. } }); mediaPlayer.prepareAsync(); } catch (IOException e) { Toast.makeText(getApplicationContext(), "ERROR " + e, Toast.LENGTH_LONG).show(); Log.d("radio", "error " + e); } mediaPlayer.start(); } } }); } } 

main.xml

   

No tengo ni idea, por qué obtengo – (38, 0) código y qué significa. Estoy usando Intellij IDEA y probando este código en emuladores Android 2.3 y 4.2 y tengo algún problema.

    -38 se refiere al código de error ENOSYS de errno.h (vea esta explicación https://stackoverflow.com/a/15206308/768935 )

    Parece que intenta comenzar la reproducción antes de que se complete la preparación. Use el método setOnPreparedListener() para establecer un escucha de preparación y llame al método start() solo después de que se complete la preparación.

     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mp.start(); } }); mediaPlayer.prepareAsync(); 

    Y elimine la mediaPlayer.start() actual de mediaPlayer.start() desde el código.

    getDuration(); mi error -38 al llamar a getDuration(); en el MediaPlayer antes de que estuviera preparado.


    Vale la pena consultar el documento de MediaPlayer .

    Hay un párrafo que comienza It is a programming error to invoke methods such as getCurrentPosition()...

    que tiene una lista de métodos que no son ideales para llamar antes de que se prepare el MediaPlayer, que a su vez puede dar como resultado -38 .

    Es mejor que compruebe si está ejecutando alguna operación que esté relacionada con el estado de reproducción como getCurrentPosition() antes de que se inicie Mediaplayer.

    El código de error -38 debe corresponder a INVALID_OPERATION .

    Una posible causa de esto es que no espera a que prepareAsync finalice antes de llamar al start . Debe configurar un OnPreparedListener e iniciar el MediaPlayer solo cuando se haya llamado a onPrepared .

    @allprog y @Michael tienen razón. Pero hay otra manera, si no quiere usar prepareAsync (), use prepare (). Eso es locking, que se devuelve solo cuando está preparado.