2010-05-02 2 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 для каждого щелчка в представлении активности, а не в кнопке. Вам нужно только установить прослушиватель один раз и для кнопки, а не для всеобъемлющего представления; Я имею тенденцию делать это в конструкторе Деятельности.

  • Что касается вашей ошибки, MediaPlayer отлично подходит для меня, когда Context I pass it является основным действием. Когда вы проходите 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

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

файл yoursoundfile должен быть в Резе/необработанной папке

13

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

0

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

view.playSoundEffect(SoundEffectConstants.CLICK); 

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

android:soundEffectsEnabled="true" 

в вашем xml.

Смежные вопросы