2012-04-24 7 views
10

Ich habe ein seltsames Problem. Ich verwende die PrepareAsync-Methode mit der MediaPlayer, aber der Listener, den ich deklariert habe, wird nie gefeuert. Ich versuche einen live .mp3 Feed aus dem Internet (Radiostation) zu streamen. Ich verwende eine Inline-Methode für den Listener, aber ich habe auch versucht, die Schnittstelle ohne Erfolg zu implementieren. Hier ist ein Teil meines Codes:AndroId MediaPlayer prepareAsync Methode

Im Mitgliederbereich:

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

In Aktivität 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(); 

Dann ist hier die preparePlayer() Methode:

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

Und (nur für das Protokoll), die onDetroy(), wo ich die Reinigung tun:

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

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

sagt das Log irgendwas darüber, was passiert oder gibt es Fehler? Hast du die Erlaubnis zu den Internets? – zapl

Antwort

10

Sie sind die OnPreparedListener in Ihrer Activity ‚s create-Methode einstellen und später möglicherweise eine neue zu schaffen MediaPlayer in Ihrer preparePlayer() Methode. Alle neu erstellten MediaPlayer haben nicht die prepareListener festgelegt. Sie sollten auch eine errorlistener hinzufügen, um herauszufinden, was los ist.

Sie können den setOnPreparedListener Anruf innerhalb der

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

sowie Einstellung eines setOnErrorListener wie so bewegen:

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

Bitte ändern e.printStackTrace(); zu

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

Hope this hilft, lassen Sie uns wissen, wenn Sie irgendwelche Protokolldaten haben wird auch nützlich sein.

+0

Danke! Ich habe deinen Ratschlag benutzt und überprüfe, ob es vorher null ist. Aber das hat mein Problem nicht gelöst. –

+0

Danke! Sehr gut erklärt – Manza

1

Es stellte sich heraus, dass ich vergessen habe, das "@Override" auf meiner inneren Methode zu erwähnen. Wie folgt:

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

Jetzt funktioniert alles gut. Nun ... fast, da es ewig dauert, um zu puffern ...

+0

D'oH !!! haha ... froh, dass du es herausgefunden hast !! :) – petey

+1

ziemlich alt, aber ich möchte noch darauf hinweisen, dass * die @Override-Anweisung keinen Code * erzeugt und daher möglicherweise keine Lösung für diese oder andere Code-bezogene Probleme sein kann. Siehe http://stackoverflow.com/a/8545586/2177061 als Referenz. – Rick77

+0

Das ist wahrscheinlich nicht die Ursache für dieses Problem. Ich habe jetzt genau das gleiche Problem und die Einstellung "Override" hilft nicht. Während die Beispielanwendung es auch nicht gesetzt hat. –