Android Soundboard 一次只有一种声音

Posted

技术标签:

【中文标题】Android Soundboard 一次只有一种声音【英文标题】:Android Soundboard only one sound at a time 【发布时间】: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() 的东西时,应用程序根本无法工作。 有什么建议我应该在我的函数/代码中更改吗?

【问题讨论】:

【参考方案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 文件? 发现了一个类似的问题:***.com/questions/13377604/…

以上是关于Android Soundboard 一次只有一种声音的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 只能点击一次 html 按钮

将声音添加到 SoundBoard 恶作剧程序

jQuery Soundboard - 播放一个按钮会关闭所有其他按钮

带有开关按钮的 Android ListView - 一次只有一个开关处于活动状态

在Android中,想要TranslateAnimation与for循环一起用,但运行结果只有最后一次循环移动,不明求教

Android Service详解