如何在Android中点击按钮时播放声音?

5
我将为您进行翻译:当我点击按钮时,我想播放一个声音文件,但是一直出现错误。错误信息如下:
 "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);
        }
    });
}

任何帮助或提示都将不胜感激。谢谢!
5个回答

24

这里有几件事情需要注意(免责声明,这只是我习惯使用的方式,可能存在更好的方法):

  • 您似乎每次点击都要执行更多的操作。 您正在为 Activity 的 View 创建并添加新的 onClickListener,而不是为 Button 创建该监听器。 您只需要一次设置该监听器,并将其设置在 Button 上即可。 我倾向于在 Activity 的构造函数中执行此操作。

  • 关于错误的问题,当我传递覆盖 Activity 的 Context 时,MediaPlayer 对我来说工作得很好。 当您传递 this 时,它将传递您创建的 onClickListener,从而影响 MediaPlayer。

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

因此,在 Activity 的构造函数中,您可以创建一次 MediaPlayer,找到 Button,并附加一个 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();
            }
        });
    }
}

希望这能帮助到你!


14
我曾尝试使用媒体播放器,但很容易遇到麻烦。我听从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);
}

不要忘记调用 mSoundPoolHelper.release();,例如在你的 onDestroy() 中。如果使用 MediaPlayer 也需要类似的操作。



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

你的音频文件必须放在res/raw文件夹中


1
如果你真的必须以编程方式调用点击事件,因为视图没有自己的声音,我会像这样解决它,这是最简单的解决方案,只需要一行代码。
view.playSoundEffect(SoundEffectConstants.CLICK);

非常简单且有效,如果您想让布局播放声音,您需要添加以下代码:

android:soundEffectsEnabled="true"

在你的 XML 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接