如何在Android中单击按钮时播放声音?
我试图播放一个声音文件时,单击按钮,但不断收到错误。如何在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!
有几件事情怎么回事(免责声明,这只是我如何使用使用它,有可能是一个更好的办法):
你似乎做更多每次点击工作比你需要。您正在为活动的视图中的每个点击创建并添加新的
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();
}
});
}
}
希望有所帮助!
MediaPlayer mp = MediaPlayer.create(getBaseContext(),
R.raw.yoursoundfile);
mp.start();
yoursoundfile必须将该文件是在res /原始文件夹
我与媒体播放器播放左右,而它很容易陷入困境。我遵循了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,则需要类似的东西。
如果你真的要编程方式调用点击,因为该视图没有自己的声音,我会解决它这样,其最简单的解决方案和oneliner
view.playSoundEffect(SoundEffectConstants.CLICK);
非常简单的作品,如果你想使布局发挥你需要把
android:soundEffectsEnabled="true"
在您的XML。
感谢您开始工作的想法.. – Noman 2012-12-17 07:41:51