2013-08-06 30 views
0

這裏是我的應用程序的工作原理:應用程序接收到曲播放MIDI文件中的一個的AsyncTask在Android

後,它會在文件中首先保存到SD卡,然後播放。 我試圖用一個類調用的asynctask播放音樂(不是一個活動,而是一個處理程序)。但是,音樂只能播放1-2秒。下面是的AsyncTask的回調代碼:

fos = new FileOutputStream(file); 
fos.write(receivedMusicPayload); 
fos.flush(); 
fos.close(); 
PlayMusicManager pmm = new PlayMusicManager(qrC); 
pmm.execute(); 

這裏是playermanager:

public class PlayMusicManager extends AsyncTask<Void, Void, Void> { 

private QRConnection qrC; 

public PlayMusicManager(QRConnection qrC) { 
    this.qrC = qrC; 

} 

@Override 
protected Void doInBackground(Void... params) { 

    MediaPlayer mediaPlayer = new MediaPlayer(); 
    File dir = Environment.getExternalStorageDirectory(); 
    File file = new File(dir, "music.mid"); 

    if (file.exists()) // check if file exist 
    { 
     FileInputStream fis; 

     try { 
      fis = new FileInputStream(file); 
      FileDescriptor fd = fis.getFD(); 
      mediaPlayer.setDataSource(fd); 
      mediaPlayer.prepare(); 
      mediaPlayer.start(); 

     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } else { 
     qrC.getQrActivity().showResult("No such file"); 
    } 

    return null; 
} 

@Override 
protected void onPostExecute(Void parms) { 
    qrC.getQrActivity().showResult("Music Done."); 
} 

感謝您的幫助!

+0

可能是文件而不是當它開始播放存儲的100%。 – iCantSeeSharp

回答

0

您需要等到文件播放完畢。

因爲在MediaPlayer媒體播放器作爲局部變量來創建它會釋放在

protected Void doInBackground { 

結束時,你有兩個選擇。

1)製作足夠長的class的mediaPlayer變量 2)或者,放一個循環讀mediaPlayer.status。事情是這樣的:

while (mediaPlayer.status==MediaPlayer.Status.PLAYING) 
    sleep(100);