Jouer le son sur le bouton cliquez sur Android


109

Comment puis-je obtenir un bouton pour lire un son à partir du brut lorsque vous cliquez? Je viens de créer un bouton avec un identifiant button1, mais quel que soit le code que j'écris, tout est faux.

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



}

1
Vous voudrez probablement que les ressources soient gérées automatiquement, afin de pouvoir appeler MusicManager.getInstance().play(this, R.raw.my_sound);. Si tel est le cas, cette bibliothèque pourrait être pour vous: github.com/delight-im/Android-Audio
caw

Réponses:


228

C'est la partie la plus importante du code fourni dans le message d'origine.

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

Pour l'expliquer étape par étape:

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

Le premier est l'initialisation du bouton à utiliser pour jouer le son. Nous utilisons l'activité findViewById, en passant l'identifiant que nous lui avons attribué (dans le cas de cet exemple:) R.id.button1, pour obtenir le bouton dont nous avons besoin. Nous le convertissons en un Buttonafin qu'il soit facile de l'affecter à la variable oneque nous initialisons. Expliquer davantage comment cela fonctionne est hors de portée de cette réponse. Cela donne un bref aperçu de son fonctionnement.

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

Voici comment initialiser un fichier MediaPlayer. Le MediaPlayer suit le modèle de conception de méthode de fabrique statique . Pour obtenir une instance, nous appelons sa create()méthode et lui passons le contexte et l'ID de ressource du son que nous voulons jouer, dans ce cas R.raw.soho. Nous le déclarons comme final. Jon Skeet a fourni une excellente explication sur les raisons pour lesquelles nous le faisons ici .

one.setOnClickListener(new OnClickListener(){

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

Enfin, nous définissons ce que fera notre bouton précédemment initialisé. Jouez un son en cliquant sur le bouton! Pour ce faire, nous définissons le OnClickListenerde notre bouton one. À l'intérieur, il n'y a qu'une seule méthode, onClick()qui contient les instructions que le bouton doit faire lors d'un clic .

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

Pour jouer le son, nous appelons la start()méthode de MediaPlayer . Cette méthode démarre la lecture du son.

Là, vous pouvez maintenant jouer un son en cliquant sur un bouton sous Android!


Partie bonus:

Comme indiqué dans le commentaire ci-dessous Merci Langusten Gustel! , et comme recommandé dans la référence pour les développeurs Android , il est important d'appeler la release()méthode pour libérer des ressources qui ne seront plus utilisées. Habituellement, cela est fait une fois que le son à jouer est terminé. Pour ce faire, nous ajoutons un OnCompletionListenerà notre mp comme ainsi:

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

À l'intérieur de la onCompletionméthode, nous la publions comme ceci:

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

Il existe évidemment de meilleures façons de mettre cela en œuvre . Par exemple, vous pouvez faire du MediaPlayer une variable de classe et gérer son cycle de vie avec le cycle de vie du Fragmentou Activityqui l'utilise. Cependant, ceci est un sujet pour une autre question. Pour limiter la portée de cette réponse, je l'ai écrite juste pour illustrer comment jouer un son lors d'un clic sur un bouton sous Android .


Message original

Première. Vous devez mettre vos instructions dans un bloc, et dans ce cas la méthode onCreate.

Seconde. Vous avez initialisé le bouton en tant que variable 1 , puis vous avez utilisé une variable zéro et défini son onClickListener sur un onClickListener incomplet. Utilisez la variable 1 pour setOnClickListener.

Troisièmement, placez la logique pour jouer le son dans le onClick.

En résumé:

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
Et d'ailleurs son one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Ne manquez pas ça!
Auto-Droid ツ

7
dont't for get toRELEASE
Langusten Gustel

38

Testé et fonctionne à 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(); }
            }
        });
    }
}

C'était tout ce que nous avions à faire

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

Cela fonctionne également lors de la lecture de l'audio. Lors de la lecture du son, je pense que mp.start () fonctionnera sans les blocs try / catch et if.
khwilo

37

La meilleure façon de le faire est ici que j'ai trouvée après avoir recherché un problème après l'autre dans le 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();

Ne pas libérer le lecteur multimédia vous donne cette erreur dans LogCat:

Android: MediaPlayer finalisé sans être publié

Ne pas réinitialiser le lecteur multimédia vous donne cette erreur dans LogCat:

Android: Mediaplayer est parti avec des événements non gérés

Alors, jouez un code simple et sûr pour utiliser le lecteur multimédia.

Pour lire plusieurs sons dans la même activité / fragment, changez simplement le resID lors de la création d'un nouveau lecteur multimédia comme

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

et jouez!

S'amuser!


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

Voici le résultat, encore une fois rien ne fonctionne dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

Vous n'avez pas besoin de la ligne mp = new MediaPlayer () car vous l'initialisez à nouveau en utilisant MediaPlayer.create (...) sur la ligne suivante.
Keale

6
  • L'audio doit être placé dans le raw dossier, s'il n'existe pas, créez-en un.
  • Le dossier raw doit se trouver dans le dossier res
  • Le nom ne doit pas -contenir de caractères spéciaux ou de caractères spéciaux.

Sur votre activité, vous devez avoir un objet MediaPlayer, à l'intérieur de la onCreateméthode ou de la onclickméthode, vous devez initialiser le MediaPlayer, comme MediaPlayer.create(this, R.raw.name_of_your_audio_file), puis votre fichier audio ir prêt à être joué avec l'appel de start(), dans votre cas, puisque vous le souhaitez placé dans un bouton, vous devrez le mettre dans la onClickméthode.

Exemple:

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

il existe des sons prédéfinis: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Agréable!

MediaActionSound

Une classe pour produire des sons qui correspondent à ceux produits par diverses actions entreprises par les API des médias et des caméras. Docs

utiliser comme:

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

Essayez ceci, je pense que cela fonctionnera


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

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

    }

créer un bouton avec une méthode peut être appelé lorsque le bouton est enfoncé (onCreate),

puis créez une variable pour la classe (MediaPlayer) avec le chemin de votre fichier

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

enfin exécuter la méthode de démarrage dans cette classe

mp.start();

le fichier s'exécutera lorsque le bouton sera enfoncé, j'espère que cela vous a été utile!


3
Bienvenue dans Stack Overflow! Il serait préférable que vous ajoutiez des explications et des commentaires à votre code afin que les futurs lecteurs puissent apprendre de vous.
Mehdi Bounya

1

Au lieu de le réinitialiser comme proposé par DeathRs:

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

nous pouvons simplement réinitialiser le MediaPlayer pour qu'il commence à utiliser:

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

1

Toutes ces solutions "sonnent" bien et raisonnables mais il y a un gros inconvénient. Que se passe-t-il si votre client télécharge votre application et appuie à plusieurs reprises sur votre bouton?

Votre MediaPlayer parfois à jouer votre son si vous cliquez plusieurs fois sur le bouton.

J'ai rencontré ce problème de performances avec la MediaPlayerclasse il y a quelques jours.

La MediaPlayerclasse est-elle sauvegardée pour être utilisée? Pas toujours. Si vous avez des sons courts, il est préférable d'utiliser la SoundPoolclasse.

Une solution efficace et efficace est la classe SoundPool qui offre d'excellentes fonctionnalités et augmente les performances de votre application.

SoundPool n'est pas aussi facile à utiliser que le MediaPlayer classe mais présente de grands avantages en de performances et de fiabilité.

Suivez ce lien et découvrez comment utiliser la classe SoundPool dans votre application:

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

Youtube: solution de sauvegarde


0

Un cas de bord: au- dessus de chaque réponse est presque correcte mais j'étais coincé dans un cas de bord. Si un utilisateur clique au hasard sur le bouton plusieurs fois en quelques secondes, il ne répond plus après avoir joué du son.

Raison: l' initialisation de l' Mediaplayerobjet coûte très cher. Il traite également des ressources ( fichier audio ), donc cela prend un certain temps. Lorsque les utilisateurs au hasard initialize et appeler une méthode de MediaPlayerméthodes comme de » start(), stop(), release(), etc peut causer IllegalStateExceptionque je dû faire face.

Solution: Merci caw pour sa suggestion dans le commentaire sur Android-Audio . Il a juste deux classes java simples ( MusicManager.java, SoundManager.java).

Vous pouvez utiliser MusicManager.javasi vous souhaitez lire des fichiers son uniques -

MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);

Vous pouvez utiliser SoundManager.javasi vous souhaitez jouer plusieurs sons fréquemment et rapidement -

class MyActivity extends Activity {

    private SoundManager mSoundManager;

    @Override
    protected void onResume() {
        super.onResume();

        int maxSimultaneousStreams = 3;
        mSoundManager = new SoundManager(this, maxSimultaneousStreams);
        mSoundManager.start();
        mSoundManager.load(R.raw.my_sound_1);
        mSoundManager.load(R.raw.my_sound_2);
        mSoundManager.load(R.raw.my_sound_3);
    }

    private void playSomeSound() {
        if (mSoundManager != null) {
            mSoundManager.play(R.raw.my_sound_2);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mSoundManager != null) {
            mSoundManager.cancel();
            mSoundManager = null;
        }
    }

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.