Как воспроизвести звук при нажатии кнопки в Android? - PullRequest
5 голосов
/ 02 мая 2010

Я пытаюсь воспроизвести звуковой файл, когда нажата кнопка, но продолжает выдавать ошибку.

Ошибка:

 "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!

Ответы [ 5 ]

24 голосов
/ 02 мая 2010

Здесь происходит несколько вещей (отказ от ответственности, это то, как я привык к этому, может быть, есть лучший способ):

  • Кажется, вы выполняете намного больше работы за клик, чем нужно. Вы создаете и добавляете новый onClickListener для каждого клика в представлении действия, а не для кнопки . Вам нужно установить слушателя только один раз, и для кнопки, а не для общего представления; Я склонен делать это в конструкторе Activity.

  • Что касается вашей ошибки, MediaPlayer отлично работает для меня, когда контекст, который я передаю, является основной операцией. Когда вы передаете this, он передает onClickListener, который вы создаете, отбрасывая MediaPlayer.

  • Наконец, чтобы действительно воспроизвести звук, вы должны позвонить start().

Таким образом, для конструктора в Activity вы можете создать 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();
            }
        });
    }
}

Надеюсь, это поможет!

13 голосов
/ 21 декабря 2013

Я поиграл с медиаплеером, и легко попасть в неприятности. Я последовал совету Владимира, и 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.

4 голосов
/ 12 июня 2013
3 голосов
/ 21 декабря 2012
MediaPlayer mp = MediaPlayer.create(getBaseContext(),
R.raw.yoursoundfile);
mp.start();

файл yoursoundfile должен находиться в папке res / raw

0 голосов
/ 11 августа 2016

Если вам действительно нужно вызывать щелчок программно, потому что представление не имеет собственного звука, я бы решил его таким образом, это самое простое решение и единственный пользователь

view.playSoundEffect(SoundEffectConstants.CLICK);

очень просто и работает, если вы хотите, чтобы макет воспроизводил звук, вам нужно поставить

android:soundEffectsEnabled="true"

в вашем xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...