Gérer l'état et les ressources de MediaPlayer

Ce document présente deux domaines présentant des écueils potentiels.

  • État Avec "Medialayer", certaines opérations ne sont valides que dans des états spécifiques. Des opérations incorrectes peuvent entraîner des exceptions ou un comportement inattendu.

  • Ressources Lorsque vous apportez des modifications de configuration, telles que la rotation de l'écran, vous devez libérer un objet MediaPlayer pour libérer des ressources système et éviter l'épuisement des ressources.

Gérer l'état

MediaPlayer est basé sur l'état. Autrement dit, il possède un état interne dont vous devez toujours tenir compte lorsque vous écrivez votre code, car certaines opérations ne sont valides que lorsque le lecteur se trouve dans des états spécifiques. Si vous effectuez une opération dans un état incorrect, le système peut générer une exception ou d'autres comportements indésirables.

Le diagramme des états de la documentation de la classe MediaPlayer indique quelles méthodes déplacent MediaPlayer d'un état à un autre. Exemple :

  • Lorsque vous créez un MediaPlayer, il est à l'état Inactif.
  • Vous l'initialisez en appelant setDataSource(), ce qui le met à l'état Initialisé.
  • Vous le préparez à l'aide de la méthode prepare() ou prepareAsync().
  • Une fois la préparation de MediaPlayer terminée, il passe à l'état Prepared, ce qui signifie que vous pouvez appeler start() pour qu'il lise le contenu multimédia.

À ce stade, comme illustré dans le diagramme, vous pouvez passer d'un état Started, Paused ou PlaybackCompleted à un autre en appelant des méthodes telles que start(), pause() et seekTo(), entre autres.

Toutefois, lorsque vous appelez stop(), notez que vous ne pouvez pas appeler start() à nouveau tant que vous n'avez pas préparé à nouveau MediaPlayer.

Gardez toujours à l'esprit le diagramme des états lorsque vous écrivez du code qui interagit avec un objet MediaPlayer, car appeler ses méthodes à partir du mauvais état est une cause courante de bugs.

Libérer MediaPlayer

Un MediaPlayer peut consommer d'importantes ressources système. Par conséquent, vous devez toujours prendre des précautions supplémentaires pour vous assurer de ne pas conserver une instance MediaPlayer plus longtemps que nécessaire. Lorsque vous avez terminé, vous devez toujours appeler release() pour vous assurer que les ressources système qui lui sont allouées sont correctement libérées.

Par exemple, si vous utilisez un MediaPlayer et que votre activité reçoit un appel à onStop(), vous devez libérer MediaPlayer, car il n'a guère de sens de le conserver lorsque votre activité n'interagit pas avec l'utilisateur (sauf si vous lisez des contenus multimédias en arrière-plan, ce qui est abordé dans la section suivante).

Lorsque votre activité est reprise ou redémarrée, vous devez bien entendu créer un nouvel élément MediaPlayer et le préparer à nouveau avant de reprendre la lecture.

Voici comment libérer et annuler votre MediaPlayer:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

Par exemple, considérez les problèmes qui surviennent si vous oubliez de libérer MediaPlayer lorsque votre activité s'arrête, mais que vous en créez une nouvelle lorsque l'activité redémarre. Lorsque l'utilisateur modifie l'orientation de l'écran (ou modifie la configuration de l'appareil d'une autre manière), le système redémarre l'activité par défaut. Vous risquez de consommer rapidement toutes les ressources système lorsque l'utilisateur fait pivoter l'appareil entre les modes portrait et paysage, car à chaque changement d'orientation, vous créez un nouvel élément MediaPlayer que vous ne libérez jamais.

Pour en savoir plus sur les redémarrages de l'environnement d'exécution, consultez Gérer les modifications de l'environnement d'exécution.

Vous vous demandez peut-être ce qu'il se passe si vous souhaitez continuer à lire des "contenus multimédias en arrière-plan" même lorsque l'utilisateur quitte votre activité, comme le fait l'application Music intégrée. Dans ce cas, vous avez besoin d'un MediaPlayer contrôlé par un service, comme indiqué dans la section suivante.

En savoir plus

Jetpack Media3 est la solution recommandée pour la lecture multimédia dans votre application. En savoir plus

Ces pages traitent des sujets liés à l'enregistrement, au stockage et à la lecture d'audio et de vidéo: