Reproducir sonido en el botón haga clic en Android


109

¿Cómo hago para que un botón reproduzca un sonido sin formato al hacer clic? Acabo de crear un botón con id button1, pero sea cual sea el código que escriba, todo está mal.

import android.media.MediaPlayer;

public class BasicScreenActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);
    }

    Button one = (Button)this.findViewById(R.id.button1);
    MediaPlayer = mp;
    mp = MediaPlayer.create(this, R.raw.soho);
    zero.setOnCliclListener(new View.OnClickListener() )

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.basic_screen, menu);
        return true;
    }



}

Probablemente desee que los recursos se administren automáticamente, para poder llamar MusicManager.getInstance().play(this, R.raw.my_sound);. Si es así, esta biblioteca podría ser para usted: github.com/delight-im/Android-Audio
caw

Respuestas:


227

Esta es la parte más importante del código proporcionado en la publicación original.

Button one = (Button) this.findViewById(R.id.button1);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        mp.start();
    }
});

Para explicarlo paso a paso:

Button one = (Button) this.findViewById(R.id.button1);

Primero está la inicialización del botón que se utilizará para reproducir el sonido. Usamos la actividad findViewById, pasando el Id que le asignamos (en el caso de este ejemplo :) R.id.button1, para obtener el botón que necesitamos. Lo convertimos como a Buttonpara que sea fácil asignarlo a la variable oneque estamos inicializando. Explicar más sobre cómo funciona esto está fuera del alcance de esta respuesta. Esto le da una breve idea de cómo funciona.

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);

Así es como se inicializa un MediaPlayer. El MediaPlayer sigue el patrón de diseño del método de fábrica estático . Para obtener una instancia, llamamos a su create()método y le pasamos el contexto y el Id del recurso del sonido que queremos reproducir, en este caso R.raw.soho. Lo declaramos como final. Jon Skeet proporcionó una gran explicación de por qué lo hacemos aquí .

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

Finalmente, configuramos lo que hará nuestro botón previamente inicializado. ¡Reproduce un sonido al hacer clic en el botón! Para hacer esto, configuramos el OnClickListenerde nuestro botón one. En el interior hay solo un método, onClick()que contiene las instrucciones que debe seguir el botón al hacer clic .

public void onClick(View v) {
    mp.start();
}

Para reproducir el sonido, llamamos al start()método de MediaPlayer . Este método inicia la reproducción del sonido.

Allí, ahora puedes reproducir un sonido al hacer clic en un botón en Android.


Parte de bonificación:

Como se indica en el comentario a continuación, ¡ Gracias Langusten Gustel! , y como se recomienda en la Referencia para desarrolladores de Android , es importante llamar al release()método para liberar recursos que ya no se utilizarán. Normalmente, esto se hace una vez que se ha completado la reproducción del sonido que se va a reproducir. Para hacerlo, agregamos un OnCompletionListenera nuestro me mp gusta así:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

Dentro del onCompletionmétodo, lo lanzamos así:

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

Obviamente, hay mejores formas de implementar esto. Por ejemplo, puede hacer que MediaPlayer sea una variable de clase y manejar su ciclo de vida junto con el ciclo de vida del Fragmento Activityque lo usa. Sin embargo, este es un tema para otra pregunta. Para mantener pequeño el alcance de esta respuesta, la escribí solo para ilustrar cómo reproducir un sonido al hacer clic en un botón en Android .


Publicación original

Primero. Debe poner sus declaraciones dentro de un bloque, y en este caso el método onCreate.

Segundo. Inicializó el botón como variable uno , luego usó una variable cero y estableció su onClickListener en un onClickListener incompleto. Utilice la variable uno para setOnClickListener.

En tercer lugar, ponga la lógica para reproducir el sonido dentro de onClick.

En resumen:

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class BasicScreenActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);

        Button one = (Button)this.findViewById(R.id.button1);
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
        one.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                mp.start();
            }
        });
    }
}

1
Y, por cierto, es one.setOnClickListener (nuevo View.OnClickListener () {public void onClick (Ver v) {mp.start ();}}); ¡No te lo pierdas!
Auto-Droid ツ

7
no para llegar aRELEASE
Langusten Gustel

38

Probado y funcionando al 100%

public class MainActivity extends ActionBarActivity {
    Context context = this;
    MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mp = MediaPlayer.create(context, R.raw.sound);
        final Button b = (Button) findViewById(R.id.Button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    if (mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                        mp = MediaPlayer.create(context, R.raw.sound);
                    } mp.start();
                } catch(Exception e) { e.printStackTrace(); }
            }
        });
    }
}

Esto era todo lo que teníamos que hacer

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}

Esto también funciona al reproducir el audio. Al reproducir sonido, creo que mp.start () funcionará sin los bloques try / catch y if.
khwilo

37

La mejor manera de hacer esto es aquí que encontré después de buscar un problema tras otro en LogCat

MediaPlayer mp;
mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

No liberar el reproductor multimedia le da este error en LogCat:

Android: MediaPlayer finalizado sin ser lanzado

No restablecer el reproductor multimedia le da este error en LogCat:

Android: mediaplayer se fue con eventos no controlados

Así que juega con el código seguro y simple para usar el reproductor multimedia.

Para reproducir más de un sonido en la misma actividad / fragmento, simplemente cambie el resID mientras crea un nuevo reproductor multimedia como

mp = MediaPlayer.create(context, R.raw.sound_two);

y jugarlo!

¡Que te diviertas!


8
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    MediaPlayer mp;
    Button one;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mp = MediaPlayer.create(this, R.raw.soho);
        one = (Button)this.findViewById(R.id.button1);

        one.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mp.start();
            }
        });
    }
}

Aquí está el resultado, nuevamente nada funciona dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

No necesita la línea mp = new MediaPlayer () porque la está inicializando nuevamente usando MediaPlayer.create (...) en la siguiente línea.
Keale

6
  • El audio debe colocarse en la rawcarpeta, si no existe, cree uno.
  • La carpeta sin formato debe estar dentro de la carpeta res
  • El nombre no debe tener -caracteres especiales.

En su actividad, debe tener un objeto MediaPlayer, dentro del onCreatemétodo o el onclickmétodo, debe inicializar el MediaPlayer, como MediaPlayer.create(this, R.raw.name_of_your_audio_file), luego su archivo de audio está listo para ser reproducido con la llamada start(), en su caso, ya que desea que sea colocado en un botón, tendrás que ponerlo dentro del onClickmétodo.

Ejemplo:

private Button myButton;
private MediaPlayer mp;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        mp = MediaPlayer.create(this, R.raw.gunshot);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
}
}

3

hay algunos sonidos predefinidos: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

¡Agradable!

MediosAcciónSonido

Una clase para producir sonidos que coinciden con los producidos por diversas acciones realizadas por las API de cámara y medios. Docs

usar como:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}

2
Button button1=(Button)findViewById(R.id.btnB1);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer mp1 = MediaPlayer.create(this, R.raw.b1);
mp1.start();
}
});

Prueba esto, creo que funcionará


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

        MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
        mp.start();

    }

crear un botón con un método podría ser llamado cuando el botón presionado (onCreate),

luego crea una variable para la clase (MediaPlayer) con la ruta de tu archivo

MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);

finalmente ejecuta el método de inicio en esa clase

mp.start();

el archivo se ejecutará cuando se presione el botón, ¡espero que esto haya sido útil!


3
¡Bienvenido a Stack Overflow! Sería mejor si agrega alguna explicación y comentarios a su código para que los futuros lectores puedan aprender de usted.
Mehdi Bounya

1

En lugar de restablecerlo como lo proponen DeathRs:

if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();

podemos simplemente restablecer el MediaPlayer para que comience a usar:

if (mp.isPlaying()) {
       mp.seekTo(0)
}

1

Todas estas soluciones "suenan" agradables y razonables, pero hay una gran desventaja. ¿Qué sucede si su cliente descarga su aplicación y presiona repetidamente su botón?

A MediaPlayerveces, no podrá reproducir su sonido si hace clic en el botón muchas veces.

Me encontré con este problema de rendimiento con la MediaPlayerclase hace unos días.

¿La MediaPlayerclase se guarda para usar? No siempre. Si tiene sonidos cortos, es mejor usar la SoundPoolclase.

Una solución segura y eficiente es la clase SoundPool que ofrece excelentes funciones y aumenta el rendimiento de su aplicación.

SoundPool no es tan fácil de usar como su MediaPlayerclase, pero tiene grandes beneficios cuando se trata de rendimiento y confiabilidad.

Siga este enlace y aprenda a usar la clase SoundPool en su aplicación:

https://developer.android.com/reference/android/media/SoundPool

Youtube: Guardar solución

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.