La musique sous Android
La classe MediaPlayer() permet de jouer des fichiers sons (ogg/mp3/wav) dont le volume sur disque est important. Il s'occupera de tout: Chargement par petits blocs du contenu du fichier en mémoire pour décodage et envoi vers la puce sonore, tout cela en tâche de fond et complétement transparent pour le développeur. Idéal pour jouer un fichier musique pour un jeux par exemple.
Pour des effets
sonores, des fichiers normalement peut volumineux, utilisez plutôt SoundPool().
Le principe
Vraiment très simple: Indiquer où se trouve le fichier "musique", et lui dire de le jouet !
Bon, après, il y aura forcement des trucs un poil plus compliqué : )
Instanciation de la classe MediaPlayer
MediaPlayer mediaPlayer = new MediaPlayer();
Le MediaPlayer est alors dans un état idle...important pour la suite.
Preciser le fichier à utiliser
Il suffit de passer par la méthode setDataSource().
Cette méthode
ne peut être appelée que si MediaPlayer est dans l'état
"idle", sinon une exception se déclenchera.
Elle se présente sous différentes formes:
setDataSource(FileDescriptor)
Fichier sous asset
Si votre fichier se trouve sous asset, il faudra utiliser la méthode AssetFileDescriptor.getFileDescriptor():
Autres répertoires
setDataSource(String) avec String qui sera composé du chemin d'accès au fichier et du fichier lui-même.
ou setDataSource(FileDescriptor, offset, length)
FileDescriptor descripteur du fichier
offset : position de départ pour lire la musique dans le fichier
length: Longueur à jouer.
Vérifiez que les exceptions suivantes ne se déclenchent pas :
IllegalStateException si setDataSource() est appelée alors que le media player n'est pas idle.
IllegalArgumentException ou IOException peuvent aussi être générées.
Le MediaPlayer passe de l'état Idle à l'état Initialized.
Préparer la musique
Il s'agit d'indiquer au Media player qu'il peut se préparer à jouer la musique (bref, une phase d'initialisation du media player pour ouvrir le fichier et changer ses buffers).
Il y a deux manières:
- Synchrone
mediaPlayer.prepare();
En sortie, MediaPlayer passe à l'étatprepared
- Asynchrone
mediaPlayer.prepareAsync();
En sortie, MediaPlayer passe à l'étatpreparing et MediaPlayer va continuer pendant ce temps à préparer...
Listener OnPreparedListener
Pour savoir s'il a terminé sa préparation, il faudra installer un listener avant l'appel à prepareAsync:
setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)
La méthode onPrepared() sera alors déclenchée lorsque le mediaPlayer passera de l'état preparing à prepared.
Là encore, une exception peut se produire: IllegalStateException si vous n'étiez pas dans le bon état avant de lancer un "prepare".
Dans cet état, il sera possible d'ajuster le volume, les répétitions, ...
Jouer la musique
Il n'y a plus qu'à jouer la musique:
mediaPlayer.start();
Le media player sera alors dans un état started
Faire un start
alors que le media player est déjà dans un état started
est sans effet.
Listener pour indiquer la fin de la musique
La méthode onCompletion(), peut être déclecnchée si un listener OnCompletionListener a été positionné via setOnCompletionListener(OnCompletionListener). Cela permet ainsi de savoir que MediPlayer est dans l'état PlaybackCompleted.
Il est tout à fait possible de refaire un start lorsque le media est dans cet état.
Listener pour indiquer la fin d'un déplacement
seekTo(int) permet de se déplacer dans la musique. onSeekComplete() pourra être déclenché pour indiquer la fin du déplacement si un listener OnSeekCompleteListener a été positionné avant l'appel à la méthode seek(). setOnSeekCompleteListener(OnSeekCompleteListener)
Options supplémentaires
La méthode pause() pour mettre MediaPlayer dans l'état paused. Start() pour reprendre (Intéressant dans le cycle de vie d'une activité cf.onPause sur activité).
stop() pour arrêter la musique. Marche sur MediaPlayer qui se trouve dans les états Started, Paused, Prepared ou PlaybackCompleted (Intéressant dans le cycle de vie d'une activité cf. onStop sur Activité). Pour relancer la musique, il sera nécessaire de refaire un prepare() ou prepareAsync().
setLooping(boolean) pour indiquer qu'il faut jouer la musique en boucle.
boolean isLooping() pour indiquer que le media player est en boucle ou non.
boolean isPlaying() pour indiquer que le media joue la musique.
void setVolume(float leftVolume, float rightVolume) pour positionner le volume droite et gauche.
Terminer avec le media player
Afin de libérer les ressources, si vous n'avez plus besoin du media player, il est intéressant de faire:
void release()
Exemple de code
Chargement d'un fichier nommé musique.mp3 sous assets de votre projet: