2012-04-24 13 views
10

Ho uno strano problema. Io uso il metodo prepareAsync con lo MediaPlayer, ma l'ascoltatore che ho dichiarato non viene mai licenziato. Provo a trasmettere in streaming un feed .mp3 live da Internet (stazione radio). Uso un metodo inline per l'ascoltatore, ma ho anche provato a implementare l'interfaccia senza alcun successo. Ecco una parte del mio codice:AndroId MediaPlayer prepareAsync metodo

Nella sezione membro:

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

In Attività 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(); 

Poi, ecco il metodo preparePlayer():

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

E (solo per la cronaca), il onDetroy() dove faccio le pulizie:

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

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

il registro dice qualcosa su cosa succede o ci sono errori? Hai il permesso di internet? – zapl

risposta

10

si imposta il OnPreparedListener nel metodo Activity 's creare e in seguito, eventualmente, la creazione di una nuova MediaPlayer nel metodo preparePlayer(). Qualsiasi nuovo MediaPlayer non avrà il set prepareListener. Dovresti anche aggiungere uno errorlistener per scoprire cosa sta succedendo.

Si consiglia di spostare il setOnPreparedListener chiamata all'interno del

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

così come l'impostazione di un setOnErrorListener in questo modo:

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

favore cambia e.printStackTrace(); per

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

Spero che questo aiuta, facci sapere se hai qualche dato di registro come questo sarà anche utile

+0

Grazie! Ho usato il tuo consiglio e controllo se è null prima. Ma questo non ha risolto il mio problema. –

+0

Grazie! Molto ben spiegato – Manza

1

Spento, ho dimenticato di menzionare "@ Override" in cima al mio metodo interno. In questo modo:

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

Ora tutto funziona correttamente. Beh ... quasi, dal momento che ci vuole un tempo per tamponare ...

+0

D'oH !!! haha ... contento che tu l'abbia capito !! :) – petey

+1

piuttosto vecchio, ma vorrei comunque precisare che * l'istruzione @Override non produce codice * e quindi non può essere una soluzione a questo o altri problemi relativi al codice. Vedi http://stackoverflow.com/a/8545586/2177061 per riferimento. – Rick77

+0

Probabilmente non è la causa di questo problema. Ora sto avendo lo stesso identico problema e l'impostazione "Override" non aiuta. Anche se l'applicazione di esempio non l'ha comunque impostata. –