这是我的应用程序的工作方式:
应用程序收到音乐后,会先将文件保存到SD卡中,然后再播放。 我试图用类调用的异步任务来播放音乐(不是 Activity 而是处理程序)。但是,音乐只能播放 1-2 秒。下面是 AsyncTask 的回调代码:
fos = new FileOutputStream(file);
fos.write(receivedMusicPayload);
fos.flush();
fos.close();
PlayMusicManager pmm = new PlayMusicManager(qrC);
pmm.execute();
这是播放器管理器:
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.");
}
感谢您的帮助!
最佳答案
您需要等待文件播放完毕。
因为 MediaPlayer mediaPlayer 是作为局部变量创建的,它将在结束时释放
protected Void doInBackground {
你有两个选择。
1) 使类的 mediaPlayer 变量足够长 2) 或者,循环读取 mediaPlayer.status。像这样:
while (mediaPlayer.status==MediaPlayer.Status.PLAYING)
sleep(100);
关于android - 在 Android 的异步任务中播放 midi 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090837/