我有一个声卡应用程序,可以在按下按钮时调用音频文件。然而,在大多数按钮被按下并播放之后,我开始发现这些mediaplayer错误。有人知道如何检测它,然后重新启动或完全停止它的发生吗?谢谢你的时间。
科尔比

    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        ImageButton button = (ImageButton) findViewById(entry.getKey());
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    int sound = map.get(v.getId());
                    mp = MediaPlayer.create(myMain.this, sound);
                    mp.prepare();
                } catch (IllegalStateException e) {



                } catch (IOException e) {

                }
                mp.seekTo(0);
                mp.start();

            }
        }

        );

    }

04-13 10:11:39.873:信息/媒体播放器(23152):媒体播放器开始()
04-13 10:11:39.873:详细/MediaPlayerService(18229):[666]设置循环(0)
04-13 10:11:39.873:详细/MediaPlayerService(18229):[666]设置卷(1.000000,1.000000)
04-13 10:11:39.873:详细/音频接收器(18229):设置音量(1.000000,1.000000)
04-13 10:11:39.873:详细/MediaPlayerService(18229):[666]开始
04-13 10:11:39.873:debug/awesomeplayer(18229):[u5b]播放(556)
04-13 10:11:39.873:debug/awesomeplayer(18229):[u5b]播放(562)
04-13 10:11:39.873:详细/音频接收器(18229):打开(44100,1,1,4)
04-13 10:11:39.873:error/audioflinger(18229):没有可用的曲目名称
04-13 10:11:39.873:错误/AudioTrack(18229):AudioFlinger无法创建磁道,状态:12
04-13 10:11:39.873:错误/音频接收器(18229):无法创建音频曲目
04-13 10:11:39.873:错误/媒体播放器(23152):错误(-19,0)
04-13 10:11:39.894:info/mediaplayer(23152):mediaplayer handleMessage what=5
04-13 10:11:39.894:info/mediaplayer(23152):mediaplayer handleMessage what=1
04-13 10:11:39.894:info/mediaplayer(23152):mediaplayer handleMessage what=4
04-13 10:11:42.114:信息/媒体播放器(23152):媒体播放器创建()
04-13 10:11:42.114:信息/媒体播放器(23152):媒体播放器
04-13 10:11:42.114:详细/MediaPlayerService(18229):客户端(667)构造函数

最佳答案

詹姆斯有正确的想法。一段时间后创建的mediaplayer实例太多,内存不足。我之前发布的一个解决方案就是这样的:

public MediaPlayer mp;
public Resources res = getResources();

View.OnClickListener listener = new View.OnClickListener() {
    public void onClick(View v) {
        try {
            int sound = map.get(v.getId());
            AssetFileDescriptor afd = res.openRawResourceFd(sound);

            mp.reset();
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
    ImageButton button = (ImageButton)findViewById(entry.getKey());
    button.setOnClickListener(listener);
}

这可能无法编译(我假设您的声音ID来自res/raw文件夹),但想法是,只要有一个mediaplayer实例,每当单击按钮时,重置该实例,将数据源设置为相应的文件描述符,准备它,然后开始播放。

07-28 01:52
查看更多