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.

Image non trouvée !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().

Image non trouvée !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

Image non trouvée !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: