2012-04-24 19 views
10

Tengo un problema extraño. Utilizo el método prepareAsync con el MediaPlayer, pero el oyente que he declarado nunca se dispara. Intento transmitir una transmisión en vivo de .mp3 desde Internet (estación de radio). Utilizo un método en línea para el oyente, pero también intenté implementar la interfaz sin ningún éxito. Aquí está una parte de mi código:AndroId MediaPlayer prepareAsync método

En la sección de miembros:

String url = "http://<my_url>.mp3"; 
MediaPlayer mediaPlayer = new MediaPlayer(); 

En la Actividad onCreate():

ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
playButton.setOnClickListener(this); 
playButton.clearFocus(); 
playButton.setClickable(false); 

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
    } 
}); 

preparePlayer(); 

Entonces, aquí está el preparePlayer() método:

private void preparePlayer() { 
    if (mediaPlayer == null) { 
     mediaPlayer = new MediaPlayer(); 
    } 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    try { 
     mediaPlayer.setDataSource(url); 
     mediaPlayer.prepareAsync(); 

    } catch (IllegalArgumentException e) { 
     Toast.makeText(
       MyStreamActivity.this, 
       getResources().getString(R.string.erreurIllegalArgument), 
       Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     Toast.makeText(
       MyStreamActivity.this, 
       getResources().getString(R.string.erreurIllegalState), 
       Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Toast.makeText(
       MyStreamActivity.this, 
       getResources().getString(R.string.erreurIO), 
       Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } 
} 

Y (sólo para el registro), el onDetroy() donde hago la limpieza:

private void releaseMediaPlayer() { 
    if (mediaPlayer != null) { 
     if(mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    releaseMediaPlayer(); 
} 
+0

¿dice el log algo sobre lo que sucede o hay errores? ¿Tienes permiso para internets? – zapl

Respuesta

10

se está ajustando el OnPreparedListener en su método Activity 's crear y más adelante, posiblemente, la creación de una nueva MediaPlayer en su método preparePlayer(). Cualquier MediaPlayer recién creado no tendrá el conjunto prepareListener. También debe agregar un errorlistener para averiguar qué está pasando.

Es posible que desee mover la llamada setOnPreparedListener dentro del

if (mediaPlayer == null) { 
    mediaPlayer = new MediaPlayer(); 
} 

, así como el establecimiento de un setOnErrorListener así:

if (mediaPlayer == null) { 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setOnErrorListener(....); 
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
      playButton.setClickable(true); 
      mp.start(); 
     } 
    }); 
} 

favor cambia e.printStackTrace(); a

Log.e("tag", e.getMessage(), e); 

Esperanza esta ayuda, avísenos si tiene datos de registro como este también será útil.

+0

Gracias! Usé tu consejo y compruebo si es nulo antes. Pero eso no resolvió mi problema. –

+0

Gracias! Muy bien explicado – Manza

1

Resulta que olvidé mencionar el "@Override" en la parte superior de mi método interno. De esta manera:

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
    } 
}); 

Ahora todo funciona bien. Bueno ... casi, ya que lleva mucho tiempo almacenar en búfer ...

+0

D'oH !!! jaja ... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡contento !! :) – petey

+1

bastante viejo, pero me gustaría señalar que * la instrucción @Override no produce código * y por lo tanto no puede ser una solución a este u otros problemas relacionados con el código. Vea http://stackoverflow.com/a/8545586/2177061 para referencia. – Rick77

+0

Probablemente esta no sea la causa de este problema. Ahora estoy teniendo exactamente el mismo problema y configurar "Anular" no ayuda. Mientras que la aplicación de ejemplo tampoco lo configuró de todos modos. –

Cuestiones relacionadas