音板应用上的mediaplayer错误

时间:2011-04-13 17:22:43

标签: android media-player

我有一个音板应用,可以在按下按钮时调用音频文件。但是,在按下并播放大部分按钮后,我开始收到这些媒体播放器错误。有谁知道如何检测它,只是重新启动或完全停止它?谢谢你的时间。

-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:INFO / MediaPlayer(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:VERBOSE / AudioSink(18229):setVolume(1.000000,1.000000)
04-13 10:11:39.873:VERBOSE / MediaPlayerService(18229):[666]开始
04-13 10:11:39.873:DEBUG / AwesomePlayer(18229):[U5B] play(556)
04-13 10:11:39.873:DEBUG / AwesomePlayer(18229):[U5B] play_l(562) 04-13 10:11:39.873:VERBOSE / AudioSink(18229):open(44100,1,1,4)
04-13 10:11:39.873:ERROR / AudioFlinger(18229):没有更多的赛道名称 04-13 10:11:39.873:ERROR / AudioTrack(18229):AudioFlinger无法创建曲目,状态:12
04-13 10:11:39.873:ERROR / AudioSink(18229):无法创建音轨
04-13 10:11:39.873:ERROR / 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:INFO / MediaPlayer(23152):MediaPlayer
04-13 10:11:42.114:VERBOSE / MediaPlayerService(18229):客户端(667)构造函数

2 个答案:

答案 0 :(得分:5)

詹姆斯有正确的想法。您在一段时间后创建了太多的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,准备它,然后开始播放。

答案 1 :(得分:2)

我不太确定,但我认为您只想为每个声音创建一次媒体播放器,然后调用start,seekTo,然后停止播放。