【问题标题】:Android Soundboard only one sound at a timeAndroid Soundboard 一次只有一种声音
【发布时间】:2014-02-14 11:12:40
【问题描述】:

我正在尝试编写一个带有多个按钮的 Android 音板。每个按钮都应该播放不同的声音。

我在每个按钮上都有一个 OnClickListener:

    buttonAlan.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            playSound("alan");
        }
    });

每个按钮都调用以下函数。

private void playSound(String sound) {

    int path = getResources().getIdentifier(sound, "raw", getPackageName());
    mediaplayer = MediaPlayer.create(this, path);


    try {
        mediaplayer.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mediaplayer.start();
}

音板可以工作,但每次单击按钮时,它都会一遍又一遍地播放声音。我需要媒体播放器停止播放,但每次我写类似 mediaplayer.stop() 的东西时,应用程序根本无法工作。 有什么建议我应该在我的函数/代码中更改吗?

【问题讨论】:

    标签: java android android-mediaplayer


    【解决方案1】:

    我使用 soundpool 解决了这个问题,您还可以同时播放多个声音。 我首先初始化它并在构造函数中加载我需要的声音

    SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    int gameOverSound = soundPool.load(context, R.raw.gameover, 1);
    

    然后你就可以这样玩了:

    public void playSound(int soundId) {
          soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1);
    }
    

    编辑: 关于媒体播放器,您必须在开始播放另一个声音之前调用 stop() 和 release()。 你也可以设置

    mPlayer.setLooping(false);
    

    【讨论】:

    • 你能告诉我“上下文”是什么吗?它是否与我的 MainActivity 的名称有关?
    • 简单地说:what is a context。如果你在一个活动中,你可以使用“this”或“getContext()”作为上下文,如果你将它移动到其他一些类,你必须通过调用活动的上下文(例如,这是访问资源所必需的)
    • 非常感谢!那成功了。现在我只需要在按下按钮时停止声音池的播放。
    • 音板现在正在工作,但所有声音在大约 6 秒后停止。经过一番研究,我来到这个网站ignoranceisfutile.com/node/49 这里说声音文件需要是.ogg 格式,具有特定的位和采样率。有没有办法继续播放 Mp3 文件?
    • 发现了一个类似的问题:stackoverflow.com/questions/13377604/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多