【问题标题】:Android: Playing an audio clip onClickAndroid:播放音频剪辑 onClick
【发布时间】:2011-03-03 18:36:39
【问题描述】:

如何设置在用户触摸图像时播放的音频文件。

我应该在哪里存储音频文件以及我应该使用什么代码来实际播放文件? 我不想调出 MediaPlayer 界面或类似的东西。

我想这样做:

foo = (ImageView)this.findViewById(R.id.foo);
    foo.setOnClickListener(this);

public void onClick(View v) {
if (foo.isTouched()) {

 playAudioFile();
  }
}

谢谢

【问题讨论】:

  • 如下面答案所述,将my_sound.mp3放入res/raw/,然后通过R.raw.my_sound引用。但是,您有两个选择:MediaPlayer 和 SoundPool。为了有效的内存管理,您应该使用库来处理这些类:github.com/delight-im/Android-Audio

标签: android audio


【解决方案1】:

这不会创建启动 MediaPlayer 界面...它只会播放您想要的声音。

Button boton = (Button) findViewById(R.id.boton);
boton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  MediaPlayer mp = MediaPlayer.create(TestSonido.this, R.raw.slayer);  
  mp.start();
 }
});

在这种情况下,R.raw.slayer 表示一个名为 slayer.mp3 的音频文件,该文件存储在 res/raw/ 文件夹中,一旦您单击按钮,机器人就会摇摆不定...

【讨论】:

  • 如果我在完成上一个音频剪辑之前单击两次按钮会发生什么,我想它会播放双音频?
【解决方案2】:

您也可以使用SoundPool 实现相同的目的。

MediaPlayer会先将整个声音数据加载到内存中再播放,所以当我们频繁切换声音时会产生一些延迟。

SoundPool 是小尺寸声音文件的更好选择,使用.ogg 媒体文件产生更好的效果。

SoundPool pl = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        // 5 indicates the maximum number of simultaneous streams for this SoundPool object
pl.setOnLoadCompleteListener(new OnLoadCompleteListener() {             
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                // The onLoadComplet method is called when a sound has completed loading.
                soundPool.play(sampleId, 1f, 1f, 0, 0, 1);
                // second and third parameters indicates left and right value (range = 0.0 to 1.0)
            }
});

Button btn = findViewById(R.id.boton);
btn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {

     int sound = pl.load(this, R.raw.sound_01, 0);

 }
});

【讨论】:

    【解决方案3】:
    public void aud_play(View view) {
      if (!mp.isPlaying()) {   //If media player is not playing it.
    
        mp = MediaPlayer.create(this, R.raw.audio_name);
        mp.start();      
    
      } else {// Toast of Already playing ...
    }
    }
    

    【讨论】:

    • 我已经阻止了双音频问题。
    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多