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;
}
}
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-AudioRéponses:
C'est la partie la plus importante du code fourni dans le message d'origine.
Pour l'expliquer étape par étape:
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 unButton
afin qu'il soit facile de l'affecter à la variableone
que 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.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 sacreate()
méthode et lui passons le contexte et l'ID de ressource du son que nous voulons jouer, dans ce casR.raw.soho
. Nous le déclarons commefinal
. Jon Skeet a fourni une excellente explication sur les raisons pour lesquelles nous le faisons ici .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
OnClickListener
de notre boutonone
. À 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 .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 unOnCompletionListener
à notremp
comme ainsi:À l'intérieur de la
onCompletion
méthode, nous la publions comme ceci: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
Fragment
ouActivity
qui 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é:
la source
RELEASE
Testé et fonctionne à 100%
C'était tout ce que nous avions à faire
la source
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
Ne pas libérer le lecteur multimédia vous donne cette erreur dans LogCat:
Ne pas réinitialiser le lecteur multimédia vous donne cette erreur dans LogCat:
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
et jouez!
S'amuser!
la source
la source
raw
dossier, s'il n'existe pas, créez-en un.-
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 laonCreate
méthode ou de laonclick
méthode, vous devez initialiser leMediaPlayer
, commeMediaPlayer.create(this, R.raw.name_of_your_audio_file)
, puis votre fichier audio ir prêt à être joué avec l'appel destart()
, dans votre cas, puisque vous le souhaitez placé dans un bouton, vous devrez le mettre dans laonClick
méthode.Exemple:
la source
il existe des sons prédéfinis: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.
Agréable!
utiliser comme:
la source
Essayez ceci, je pense que cela fonctionnera
la source
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
enfin exécuter la méthode de démarrage dans cette classe
le fichier s'exécutera lorsque le bouton sera enfoncé, j'espère que cela vous a été utile!
la source
Au lieu de le réinitialiser comme proposé par DeathRs:
nous pouvons simplement réinitialiser le MediaPlayer pour qu'il commence à utiliser:
la source
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
MediaPlayer
classe il y a quelques jours.La
MediaPlayer
classe est-elle sauvegardée pour être utilisée? Pas toujours. Si vous avez des sons courts, il est préférable d'utiliser laSoundPool
classe.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
la source
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'
Mediaplayer
objet 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 deMediaPlayer
méthodes comme de »start()
,stop()
,release()
, etc peut causerIllegalStateException
que 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.java
si vous souhaitez lire des fichiers son uniques -Vous pouvez utiliser
SoundManager.java
si vous souhaitez jouer plusieurs sons fréquemment et rapidement -la source