2013-07-27 24 views
3

如標題所示,onPrepared()重寫的方法未被調用。Android:MediaPlayer onPrepared未被調用

mediaPlayer = new MediaPlayer(); 
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){ 
    @Override 
    public void onPrepared(MediaPlayer mp){ 
     if (mp.equals(mediaPlayer)) isReady_mediaPlayer = true; 

     Log.e("I", "Media player has been loaded to memory !"); 
    } 
}); 

mediaPlayer = MediaPlayer.create(this, R.raw.my_sound_mp3); 

回答

7

這是因爲你正在創建一個新的MediaPlayer對象。這個沒有設置任何onPreparededListener

在這裏,您創建和分配MediaPlayer對象:

mediaPlayer = new MediaPlayer(); 

接下來,您就可以設置一個onPreparedListener

但是,然後你創建並分配一個新的!此分配覆蓋您之前的行。

mediaPlayer = MediaPlayer.create(this, R.raw.my_sound_mp3); 

這個沒有設置onPreparedListener

要解決,不使用create方法,使用setDataSource代替

AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.my_sound_mp3); 
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){ 
    @Override 
    public void onPrepared(MediaPlayer mp){ 
     if (mp.equals(mediaPlayer)) isReady_mediaPlayer = true; 
     Log.e("I", "Media player has been loaded to memory !"); 
    } 
}); 
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
afd.close(); 
mediaPlayer.prepare(); 
+0

如果我通過了MediaPlayer.create(...第一,而不是MediPlayer()構造函數? –

+0

想想'的MediaPlayer的.create()'作爲一個實用的方法,創建一個新的Mediaplayer對象,設置數據源,然後調用prepare。一次性完成,沒有辦法將它短路,Juse使用'setDataSource',我已經將它包含在上面。你甚至可以在源代碼中看到它:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/media/MediaPlayer.java #MediaPlayer.create%28android.content.Context%2Candroid.net.Uri%2Candroid.view .SurfaceHolder%29 –

+0

我知道這是舊的,但我使用這個職位和onPrepared()內的代碼我嘗試mediaPlayer.start()和文件不播放? – andrewb