Premiers pas avec le lecteur multimédia

Ce document présente les concepts de base que vous devez connaître avant d'utiliser le lecteur multimédia.

Cours sur le son et la vidéo

Les classes suivantes permettent de lire du son et des vidéos dans le framework Android :

  • MediaPlayer : cette classe est l'API principale pour la lecture de sons et de vidéos.
  • AudioManager : cette classe gère les sources audio et la sortie audio sur un appareil.

Déclarations du fichier manifeste

Avant de commencer à développer votre application à l'aide de MediaPlayer, assurez-vous que votre fichier manifeste contient les déclarations appropriées pour permettre l'utilisation des fonctionnalités associées.

  • Autorisation Internet : si vous utilisez MediaPlayer pour diffuser du contenu réseau, votre application doit demander l'accès au réseau.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Autorisation WakeLock : si votre application de lecteur doit empêcher l'écran de s'assombrir ou le processeur de passer en veille, ou si elle utilise les méthodes MediaPlayer.setScreenOnWhilePlaying(boolean) ou MediaPlayer.setWakeMode(android.content.Context, int), vous devez demander cette autorisation.

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

Utiliser la classe MediaPlayer

La classe MediaPlayer est un composant essentiel du framework multimédia. Un objet de cette classe peut récupérer, décoder et lire des contenus audio et vidéo avec une configuration minimale. MediaPlayer est compatible avec plusieurs sources multimédias, y compris :

  • Ressources locales
  • URI internes, tels que ceux que vous pouvez obtenir à partir d'un Content Resolver
  • URL externes (streaming)

Pour obtenir la liste des formats multimédias compatibles avec Android, consultez la page Formats multimédias acceptés.

Exemples d'utilisation des sources audio

Voici un exemple de lecture d'un fichier audio disponible en tant que ressource brute locale (enregistrée dans le répertoire res/raw/ de votre application) :

Kotlin

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

Java

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

Dans ce cas, une ressource "brute" est un fichier que le système ne tente pas d'analyser d'une manière particulière. Toutefois, le contenu de cette ressource ne doit pas être de l'audio brut. Il doit s'agir d'un fichier multimédia correctement encodé et mis en forme dans l'un des formats compatibles.

Voici comment lire un contenu à partir d'un URI disponible localement dans le système (que vous avez obtenu via un Content Resolver, par exemple) :

Kotlin

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

Java

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

La lecture à partir d'une URL distante à l'aide du streaming HTTP se présente comme suit :

Kotlin

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

Java

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

Utiliser la préparation asynchrone pour améliorer les performances

Gardez à l'esprit les performances lorsque vous utilisez MediaPlayer. Par exemple, l'appel à prepare() peut prendre beaucoup de temps à s'exécuter, car il peut impliquer la récupération et le décodage de données multimédias. Par conséquent, comme pour toute méthode dont l'exécution peut prendre beaucoup de temps, ne l'appelez jamais à partir du thread UI de votre application. Cela entraîne l'arrêt de la réponse de l'UI jusqu'à ce que la méthode renvoie une valeur, ce qui nuit à l'expérience utilisateur et peut entraîner une erreur ANR (L'application ne répond pas).

Pour éviter de bloquer le thread UI, générez un autre thread pour préparer le MediaPlayer et avertissez le thread principal une fois l'opération terminée. Le framework fournit un moyen pratique d'accomplir la méthode prepareAsync() pour cette tâche. Cette méthode commence à préparer le contenu multimédia en arrière-plan et renvoie immédiatement. Une fois le contenu multimédia préparé, la méthode onPrepared() de MediaPlayer.OnPreparedListener, configurée via setOnPreparedListener(), est appelée.

En savoir plus

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

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