我有一个soundboard应用程序,当他们的按钮被按下时,它会调用音频文件。然而,在大多数按钮被按下并播放之后,我开始收到这些mediaplayer错误。有人知道如何检测到它并重新启动或完全阻止它发生吗?耽误您时间,实在对不起。
-colby
    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):MediaPlayer start()
04-13 10:11:39.873: VERBOSE/MediaPlayerService(18229):666 setLooping(0)
04-13 10:11:39.873: VERBOSE/MediaPlayerService(18229):666 setVolume(1.000000,1.000000)
04-13 10:11:39.873:详细/音频接收器(18229):setVolume(1.000000,1.000000)
04-13 10:11:39.873: VERBOSE/MediaPlayerService(18229):666start
04-13 10:11:39.873: DEBUG/AwesomePlayer(18229):U5B play (556)
44100-13 10:11:39.873: DEBUG/AwesomePlayer(18229):U5B play_l (562) 04-13 10:11:39.873: VERBOSE/AudioSink(18229):open(04,1,1,4)
04-13 10:11:39.873: ERROR/AudioFlinger(18229):没有更多的曲目名称可用
04-13 10:11:39.873:错误/音频轨道(18229):AudioFlinger无法创建轨道,状态: 12
04-13 10:11:39.873: ERROR/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 what=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:信息/媒体播放器(23152):MediaPlayer
04-13 10:11:42.114: VERBOSE/MediaPlayerService(18229):Client(667)构造函数
发布于 2011-04-14 02:10:49
詹姆斯的想法是正确的。您在一段时间后创建了太多的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);
}这可能无法编译(我假设您的声音it来自res/raw文件夹),但其想法是,只有一个MediaPlayer实例,每当单击按钮时,重置该实例,将数据源设置为相应的FileDescriptor,准备它,然后开始播放。
发布于 2011-04-14 01:40:30
我不是很确定,但我认为您只需要为每个声音创建一次媒体播放器,然后调用start、seekTo,然后在此之后停止。
https://stackoverflow.com/questions/5653099
复制相似问题