2012-04-24 115 views
10

我有一個奇怪的問題。我在MediaPlayer中使用prepareAsync方法,但我聲明的偵聽器永遠不會被解僱。我嘗試從互聯網(廣播電臺)流式傳輸實況.mp3。我爲偵聽器使用了一種內聯方法,但我也試圖在沒有任何成功的情況下實現該接口。下面是我的代碼的一部分:AndroId MediaPlayer prepareAsync方法

在構件部分:

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

在活動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(); 

然後,這裏的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(); 
    } 
} 

和(只是備案)時,onDetroy()在那裏我做清潔:

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

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

做日誌說什麼發生或有什麼錯誤?你有互聯網許可嗎? – zapl 2012-04-24 22:57:22

回答

10

您在設置您的Activity的創建方法OnPreparedListener後來,可能的話,創建一個新的MediaPlayer在您的preparePlayer()方法中。任何新創建的MediaPlayer都不會有prepareListener集。您還應該添加一個errorlistener以瞭解發生了什麼。

您可能需要移動內部的

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

setOnPreparedListener通話以及設置setOnErrorListener像這樣:

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

請更改e.printStackTrace();

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

希望這幫助,讓我們知道你是否有任何日誌數據也是有用的。

+0

謝謝!我用你的建議,並檢查它是否爲空。但是這並沒有解決我的問題。 – 2012-04-26 18:25:33

+0

謝謝!非常好的解釋 – Manza 2015-12-01 23:44:42

1

原來,我忘記提到我的內在方法之上的「@Override」。像這樣:

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

現在一切正常。那麼...幾乎,因爲它需要永遠緩衝...

+0

D'oH !!!哈哈......很高興你明白了! :) – petey 2012-04-27 08:27:03

+1

相當古老,但我仍想指出* @Override語句不會生成代碼*,因此不可能成爲解決此問題或其他與代碼相關的問題。請參閱http://stackoverflow.com/a/8545586/2177061以供參考。 – Rick77 2014-09-28 22:44:19

+0

這可能不是這個問題的原因。我現在有完全相同的問題,並設置「覆蓋」沒有幫助。雖然示例應用程序也沒有設置它。 – 2014-11-07 07:15:27