android - 在 Android 的异步任务中播放 midi 文件

标签 android

这是我的应用程序的工作方式:

应用程序收到音乐后,会先将文件保存到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/

相关文章:

android - 在 View 被销毁后从另一个线程访问 AutoClearedValue

java - 单击时如何获取动态生成的按钮的 id

android - getContactsFromFirebase() 方法返回一个空列表

java - 在 Eclipse (3.7) 中调试时检查对象数据

android - Android 上的 Webcal

android - 将任务发送到后台并将其带到前台

android - React Native、Android Studio、JDBC、MySql - 用户访问被拒绝 'root' @'ipaddress'

android - 使用时间选项回溯 proguard 整个 logcat

android - Nearby API 的 Strategy.DISTANCE _TYPE_ EARSHOT 似乎没有限制消息接近度

android - TabLayout Android 颜色错误