2010-05-02 109 views
5

我试图播放一个声音文件时,单击按钮,但不断收到错误。如何在Android中单击按钮时播放声音?

的错误是:

"The method create(Context, int) in the type MediaPlayer is not applicable for the arguments (new View.OnClickListener(){}, int)" 

这里是我的代码:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Button zero = (Button)this.findViewById(R.id.btnZero); 
    zero.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      mp = MediaPlayer.create(this, R.raw.mamacita_zero); 
     } 
    }); 
} 

任何帮助或建议,将不胜感激。 Thnx!

回答

23

有几件事情怎么回事(免责声明,这只是我如何使用使用它,有可能是一个更好的办法):

  • 你似乎做更多每次点击工作比你需要。您正在为活动的视图中的每个点击创建并添加新的onClickListener,而不是按钮。你只需要设置监听器一次,而不是总体视图;我倾向于在Activity的构造函数中这样做。

  • 关于您的错误,当我通过它的上下文是覆盖活动时,MediaPlayer可以正常工作。当你通过this时,它传递你正在创建的onClickListener,抛弃MediaPlayer。

  • 最后,要实际播放声音,您必须致电start()

所以对于活动中的构造函数,你可以创建MediaPlayer一次,找到按钮,并附加onClickListener,将播放从MediaPlayer的您刚刚创建的声音。它看起来像这样:

public class MyActivity extends Activity { 

    public MyActivity(Bundle onSavedStateInstance) { 
     // eliding some bookkeepping 

     MediaPlayer mp = MediaPlayer.create(this, R.raw.mamacita_zero); 

     Button zero = (Button)this.findViewById(R.id.btnZero); 
     zero.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mp.start(); 
      } 
     }); 
    } 
} 

希望有所帮助!

+0

感谢您开始工作的想法.. – Noman 2012-12-17 07:41:51

3
MediaPlayer mp = MediaPlayer.create(getBaseContext(), 
R.raw.yoursoundfile); 
mp.start(); 

yoursoundfile必须将该文件是在res /原始文件夹

13

我与媒体播放器播放左右,而它很容易陷入困境。我遵循了Volodymyr的建议,并且SoundPool更容易管理。

MediaPlayer不喜欢在当时播放多个声音,例如当您的按钮上有许多快速选项卡时。

private void playSound(Uri uri) { 
    try { 
     mMediaPlayer.reset(); 
     mMediaPlayer.setDataSource(this, uri); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
    } catch (Exception e) { 
     // don't care 
    } 

}

在构造函数中我做:我用下面的方法管理

mMediaPlayer = new MediaPlayer(); 
mSoundLess = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.less); 
mSoundMore = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.more); 

在点击我会再打电话playSound(mSoundLess):

相反,我创建了一个的Soundpool帮手:

package com.mycompany.myapp.util; 

import java.util.HashSet; 
import java.util.Set; 

import android.content.Context; 
import android.media.AudioManager; 
import android.media.SoundPool; 

public class SoundPoolHelper extends SoundPool { 
    private Set<Integer> mLoaded; 
    private Context mContext; 

    public SoundPoolHelper(int maxStreams, Context context) { 
     this(maxStreams, AudioManager.STREAM_MUSIC, 0, context); 
    } 

    public SoundPoolHelper(int maxStreams, int streamType, int srcQuality, Context context) { 
     super(maxStreams, streamType, srcQuality); 
     mContext = context; 
     mLoaded = new HashSet<Integer>(); 
     setOnLoadCompleteListener(new OnLoadCompleteListener() { 
      @Override 
      public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 
       mLoaded.add(sampleId); 
      } 
     }); 
    } 

    public void play(int soundID) { 
     AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
     float actualVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     float maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     float volume = actualVolume/maxVolume; 
     // Is the sound loaded already? 
     if (mLoaded.contains(soundID)) { 
      play(soundID, volume, volume, 1, 0, 1f); 
     } 
    } 
} 

现在我初始化这样的:

mSoundPoolHelper = new SoundPoolHelper(1, this); 
mSoundLessId = mSoundPoolHelper.load(this, R.raw.less, 1); 
mSoundMoreId = mSoundPoolHelper.load(this, R.raw.more, 1); 

和播放声音是这样的:

private void playSound(int soundId) { 
    mSoundPoolHelper.play(soundId); 
} 

不要忘了在onDestroy()打电话mSoundPoolHelper.release();,例如。如果您使用MediaPlayer,则需要类似的东西。

0

如果你真的要编程方式调用点击,因为该视图没有自己的声音,我会解决它这样,其最简单的解决方案和oneliner

view.playSoundEffect(SoundEffectConstants.CLICK); 

非常简单的作品,如果你想使布局发挥你需要把

android:soundEffectsEnabled="true" 

在您的XML。

相关问题