2011-02-04 308 views
1


我不知道這是否是一個常見問題,但我的媒體播放器延遲啓動時保持空閒一段時間,也有一段時間它不播放音頻。
早些時候,我使用的setDataSource(),但這次我使用創建(),不知道什麼是對這個問題的真正原因........

Android:媒體播放器延遲啓動

僅供參考這是代碼我使用.......

AssetFileDescriptor afd = _context.getResources().openRawResourceFd(this._soundResource.get(this._toBePlayed)); 
     mp = new MediaPlayer(); 
     mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
     afd.close(); 
     mp.setOnPreparedListener(new OnPreparedListener(){ 

      @Override 
      public void onPrepared(MediaPlayer mp) { 

       mp.start(); 
      } 
     }); 
     mp.setOnCompletionListener(new OnCompletionListener(){ 

      @Override 
      public void onCompletion(MediaPlayer mp) { 

       mp.reset(); 
       mp.release(); 
      } 
     }); 
     mp.prepareAsync(); 

回答

0

我用一個FileInputStream。您沒有設置AudioStreamType。這是我如何設置我的MediaPlayer。

public void setupMediaPlayer(){ 
    mp = new MediaPlayer(); 
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    try { 
     fis = new FileInputStream(tempFilePath); 
     mp.setDataSource(fis.getFD()); 
     mp.prepare(); 
     mp.setOnPreparedListener(this); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

tempFilePath是文件路徑。

我還在這個類中實現了setOnPreparedListener,這使得我的代碼更具可讀性。

也很大鏈接參考:MediaPlayer State Diagram

-1

我想,如果你會改變

mp.prepareAsync(); 

mp.prepare(); 

,並把

mp.start(); 

AFTE r處的mp.prepare();您的代碼將工作。試一試。

+0

這並不能解決問題:我mp.seekTo(0)onPrepared這樣固定它。相反,這會阻止主線程。 UI/UX非常糟糕。 – 2017-12-08 06:46:07

0

我也有延遲問題的的start()

mp.setOnPreparedListener(new OnPreparedListener(){ 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.seekTo(0); 
     mp.start(); 
    } 
});