2010-05-02 16 views
5

Estoy tratando de reproducir un archivo de sonido cuando se hace clic en un botón, pero sigue recibiendo un error.¿Cómo se reproduce el sonido cuando se hace clic en el botón en Android?

El error es:

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

Aquí está mi código:

@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); 
     } 
    }); 
} 

Cualquier ayuda o sugerencias serán bienvenidos. ¡Thnx!

Respuesta

23

Hay algunas cosas que suceden aquí (descargo de responsabilidad, esto es lo que estoy acostumbrado a utilizarlo, puede haber una mejor manera):

  • usted parece estar haciendo mucho más trabajo por clic de lo que necesita. Está creando y agregando un nuevo onClickListener por cada clic en la Vista de la actividad, no en el botón. Solo necesita establecer el oyente una vez, y para el Botón en lugar de la Vista general; Tiendo a hacer eso en el constructor de la Actividad.

  • En cuanto a su error, MediaPlayer funciona bien para mí cuando el Contexto lo paso es la actividad principal. Cuando pase this, está pasando el onClickListener que está creando, arrojando el MediaPlayer.

  • Finalmente, para reproducir realmente el sonido, debe llamar al start().

Así que por el constructor de la actividad, puede crear el MediaPlayer vez, encontrar el botón, y adjuntar una onClickListener que reproducirá el sonido del MediaPlayer acaba de crear. Se vería algo así como:

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(); 
      } 
     }); 
    } 
} 

Espero que ayude!

+0

gracias por la idea de comenzar a trabajar .. – Noman

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

el archivo yoursoundfile debe estar en el res/carpeta prima

13

He jugado un poco con los medios de comunicación-jugador, y se es fácil meterse en problemas. Seguí el consejo de Volodymyr, y SoundPool es mucho más fácil de administrar.

MediaPlayer no le gusta reproducir más de un sonido a la vez, como por ejemplo cuando tiene muchas pestañas rápidas en sus botones.Me las arreglé con el siguiente método:

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

}

En el constructor que hice:

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

Al hacer clic me llamaría entonces playSound(mSoundLess):

lugar he creado un ayudante 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); 
     } 
    } 
} 

Ahora init así:

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

y reproducir un sonido como esto:

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

No se olvide de llamar mSoundPoolHelper.release();, por ejemplo, en su onDestroy(). Algo similar es necesario si usa MediaPlayer.

0

Si realmente tiene que invocar el clic mediante programación porque la vista no tiene sonido propio, me gustaría resolverlo de esa manera, es la solución más sencilla y una oneliner

view.playSoundEffect(SoundEffectConstants.CLICK); 

muy simple y funciona, si quieres para hacer un diseño reproducir un sonido que necesita poner

android:soundEffectsEnabled="true" 

en su xml.

Cuestiones relacionadas