Tocar som no botão clique android

109

Como faço para que um botão reproduza um som bruto ao clicar? Acabei de criar um botão com id button1, mas qualquer que seja o código que escrevo, está tudo errado.

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



}
Dmitry
fonte
Você provavelmente gostaria de ter os recursos gerenciados automaticamente, para que você possa ligar MusicManager.getInstance().play(this, R.raw.my_sound);. Em caso afirmativo, esta biblioteca pode ser para você: github.com/delight-im/Android-Audio
caw

Respostas:

227

Esta é a parte mais importante do código fornecido na postagem 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 explicar passo a passo:

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

Primeiro é a inicialização do botão a ser usado para reproduzir o som. Usamos o Activity's findViewById, passando o Id que atribuímos a ele (no caso deste exemplo:) R.id.button1, para obter o botão que precisamos. Nós o convertemos como um Buttonpara que seja fácil atribuí-lo à variável oneque estamos inicializando. Explicar mais sobre como isso funciona está fora do escopo desta resposta. Isso dá uma breve visão sobre como funciona.

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

É assim que inicializar um MediaPlayer. O MediaPlayer segue o padrão de design do método estático de fábrica . Para obter uma instância, chamamos seu create()método e passamos a ele o contexto e o ID do recurso do som que queremos tocar, neste caso R.raw.soho. Nós o declaramos como final. Jon Skeet forneceu uma ótima explicação sobre por que fazemos isso aqui .

one.setOnClickListener(new OnClickListener(){

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

Finalmente, definimos o que nosso botão inicializado anteriormente fará. Tocar um som no clique do botão! Para fazer isso, definimos o OnClickListenerdo nosso botão one. Dentro há apenas um método, onClick()que contém as instruções que o botão deve executar ao clicar .

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

Para reproduzir o som, chamamos o start()método de MediaPlayer . Este método inicia a reprodução do som.

Lá, agora você pode tocar um som ao clicar no botão no Android!


Parte bônus:

Conforme observado no comentário abaixo Obrigado Langusten Gustel! e, conforme recomendado na Referência do desenvolvedor Android , é importante chamar o release()método para liberar recursos que não serão mais usados. Normalmente, isso é feito quando o som a ser reproduzido termina a reprodução. Para fazer isso, adicionamos um OnCompletionListenerao nosso mp like assim:

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

Dentro do onCompletionmétodo, nós o liberamos assim:

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

Obviamente, existem maneiras melhores de implementar isso. Por exemplo, você pode tornar o MediaPlayer uma variável de classe e manipular seu ciclo de vida junto com o ciclo de vida do Fragmentou Activityque o usa. No entanto, este é um assunto para outra pergunta. Para manter o escopo desta resposta pequeno, eu a escrevi apenas para ilustrar como reproduzir um som no clique de botão no Android .


Postagem Original

Primeiro. Você deve colocar suas instruções dentro de um bloco e, neste caso, o método onCreate.

Segundo. Você inicializou o botão como variável um , então usou uma variável zero e definiu seu onClickListener como um onClickListener incompleto. Use a variável um para setOnClickListener.

Terceiro, coloque a lógica para tocar o som dentro do onClick.

Em suma:

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();
            }
        });
    }
}
Keale
fonte
1
E, a propósito, é one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Não perca isso!
Auto-Droid ツ
7
não para chegar aRELEASE
Langusten Gustel
38

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

Isso foi tudo que tivemos que fazer

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}
DeathRs
fonte
Isso também funciona ao reproduzir o áudio. Ao reproduzir som, acho que mp.start () funcionará sem os blocos try / catch e if.
khwilo
37

A melhor maneira de fazer isso é aqui, depois de pesquisar um problema após o outro no 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();

Não liberar o Media player causa este erro no LogCat:

Android: MediaPlayer finalizado sem ser lançado

Não redefinir o Media player causa este erro no LogCat:

Android: o mediaplayer desapareceu com eventos não controlados

Portanto, use um código simples e seguro para usar o media player.

Para reproduzir mais de um som na mesma atividade / fragmento, basta alterar o resID enquanto cria um novo reprodutor de mídia como

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

e jogue!

Diverta-se!

sud007
fonte
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();
            }
        });
    }
}
Auto-Droid ツ
fonte
Aqui está o resultado, novamente nada funciona dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry
Você não precisa da linha mp = new MediaPlayer () porque você está inicializando-a novamente usando MediaPlayer.create (...) na próxima linha.
Keale
6
  • O áudio deve ser colocado no raw pasta, caso não exista, crie uma.
  • A pasta bruta deve estar dentro da pasta res
  • O nome não deve conter nenhum -caractere especial.

Na sua atividade, você precisa ter um objeto MediaPlayer, dentro do onCreatemétodo ou do onclickmétodo, você tem que inicializar o MediaPlayer, gosto MediaPlayer.create(this, R.raw.name_of_your_audio_file), então seu arquivo de áudio está pronto para ser tocado com a chamada para start(), no seu caso, como você quer que seja colocado em um botão, você terá que colocá-lo dentro do onClickmétodo.

Exemplo:

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

existem alguns sons predefinidos: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Agradável!

MediaActionSound

Uma classe para produzir sons que correspondem aos produzidos por várias ações realizadas pelas APIs de mídia e câmera. Docs

usar como:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
Dan Alboteanu
fonte
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();
}
});

Tente isso, acho que vai funcionar

Uzzal Prasad
fonte
1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

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

    }

criar um botão com um método pode ser chamado quando o botão pressionado (onCreate),

em seguida, crie uma variável para a classe (MediaPlayer) com o caminho do seu arquivo

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

finalmente execute o método start nessa classe

mp.start();

o arquivo será executado quando o botão for pressionado, espero que tenha sido útil!

NEC
fonte
3
Bem-vindo ao Stack Overflow! Seria melhor se você adicionar alguma explicação e comentários ao seu código para que os leitores futuros possam aprender com você.
Mehdi Bounya
1

Em vez de redefini-lo conforme proposto por DeathRs:

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

podemos apenas redefinir o MediaPlayer para o início usando:

if (mp.isPlaying()) {
       mp.seekTo(0)
}
Mikołaj Karwowski
fonte
1

Todas essas soluções "parecem" boas e razoáveis, mas há uma grande desvantagem. O que acontecerá se o seu cliente baixar seu aplicativo e pressionar repetidamente o botão?

Seu MediaPlayer às vezes vai deixar de jogar o seu som se você clicar no botão para muitas vezes.

Eu tive esse problema de desempenho com a MediaPlayerclasse alguns dias atrás.

A MediaPlayerclasse é salva para usar? Nem sempre. Se você tiver sons curtos, é melhor usar oSoundPool classe.

Uma solução econômica e eficiente é a classe SoundPool, que oferece ótimos recursos e aumenta o desempenho de seu aplicativo.

SoundPool não é tão fácil de usar quanto o MediaPlayer classe, mas tem alguns grandes benefícios quando se trata de desempenho e confiabilidade.

Siga este link e aprenda a usar a classe SoundPool em seu aplicativo:

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

Youtube: Salvar solução

TheScribbler2019
fonte