音板应用程序上的Mediaplayer错误

| 我有一个音板应用程序,可以在按下音频文件的按钮时调用该文件。但是,在大多数按钮被按下并播放后,我开始出现这些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:INFO / MediaPlayer(23152):MediaPlayer start() 04-13 13:11:39.873:VERBOSE / MediaPlayerService(18229):[666] setLooping(0) 04-13 13:11:39.873:VERBOSE / MediaPlayerService(18229):[666] setVolume(1.000000,1.000000) 04-13 10:11:39.873:VERBOSE / AudioSink(18229):setVolume(1.000000,1.000000) 04-13 13:11:39.873:VERBOSE / MediaPlayerService(18229):[666]开始 04-13 13:11:39.873:DEBUG / AwesomePlayer(18229):[U5B]播放(556) 04-13 13:11:39.873:DEBUG / AwesomePlayer(18229):[U5B] play_l(562) 04-13 10:11:39.873:VERBOSE / AudioSink(18229):打开(44100,1,1,4) 04-13 10:11:39.873:错误/ AudioFlinger(18229):没有更多可用的曲目名称 04-13 10:11:39.873:错误/ AudioTrack(18229):AudioFlinger无法创建轨道,状态:12 04-13 10:11:39.873:错误/ AudioSink(18229):无法创建音轨 04-13 10:11:39.873:错误/ MediaPlayer(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什么= 1 04-13 10:11:39.894:INFO / MediaPlayer(23152):MediaPlayer handleMessage what = 4 04-13 10:11:42.114:INFO / MediaPlayer(23152):MediaPlayer create() 04-13 10:11:42.114:INFO / MediaPlayer(23152):MediaPlayer 04-13 10:11:42.114:VERBOSE / 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实例,并且每当单击按钮时,都要重置该实例,然后将数据源设置为相应的FileDescriptor,进行准备,然后开始播放。     
我不确定,但是我想您只想为每种声音创建一次媒体播放器,然后再调用start,seekTo,然后停止即可。     

要回复问题请先登录注册