Erste Schritte mit dem Media Player

In diesem Dokument werden die grundlegenden Konzepte vorgestellt, mit denen Sie vertraut sein sollten, bevor Sie mit dem Mediaplayer arbeiten.

Sound- und Videoklassen

Die folgenden Klassen spielen Ton und Video im Android-Framework ab:

  • MediaPlayer: Diese Klasse ist die primäre API für die Wiedergabe von Audio und Video.
  • AudioManager: Diese Klasse verwaltet Audioquellen und Audioausgabe auf einem Gerät.

Manifestdeklarationen

Bevor Sie mit der Entwicklung Ihrer Anwendung mit MediaPlayer beginnen, müssen Sie dafür sorgen, dass Ihr Manifest die entsprechenden Deklarationen enthält, damit die Verwendung der zugehörigen Funktionen möglich ist.

  • Internetberechtigung:Wenn Sie MediaPlayer zum Streamen von netzwerkbasierten Inhalten verwenden, muss Ihre Anwendung den Netzwerkzugriff anfordern.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Wake Lock-Berechtigung:Wenn Ihre Player-Anwendung verhindern muss, dass das Display gedimmt wird oder der Prozessor in den Ruhemodus wechselt, oder wenn sie die Methoden MediaPlayer.setScreenOnWhilePlaying(boolean) oder MediaPlayer.setWakeMode(android.content.Context, int) verwendet, müssen Sie diese Berechtigung anfordern.

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

MediaPlayer-Klasse verwenden

Die Klasse MediaPlayer ist ein wesentlicher Bestandteil des Media-Frameworks. Mit einem Objekt dieser Klasse können sowohl Audio als auch Video mit minimalem Einrichtungsaufwand abgerufen, decodiert und wiedergegeben werden. MediaPlayer unterstützt mehrere Media-Quellen, darunter:

  • Lokale Ressourcen
  • Interne URIs, z. B. solche, die Sie von einem Content Resolver erhalten
  • Externe URLs (Streaming)

Eine Liste der von Android unterstützten Media-Formate finden Sie auf der Seite Unterstützte Media-Formate.

Beispiele für die Arbeit mit Audioquellen

Hier ist ein Beispiel dafür, wie Sie Audio abspielen können, das als lokale Rohressource verfügbar ist (im res/raw/-Verzeichnis Ihrer Anwendung gespeichert):

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

In diesem Fall ist eine „Rohressource“ eine Datei, die das System nicht auf bestimmte Weise parst. Der Inhalt dieser Ressource sollte jedoch kein reiner Audioinhalt sein. Es sollte sich um eine korrekt codierte und formatierte Mediendatei in einem der unterstützten Formate handeln.

So kannst du Inhalte über einen URI abspielen, der lokal im System verfügbar ist (z. B. über einen Content Resolver):

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();

Die Wiedergabe von einer Remote-URL über HTTP-Streaming sieht so aus:

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();

Asynchrone Vorbereitung zur Verbesserung der Leistung verwenden

Achten Sie bei der Verwendung von MediaPlayer auf die Leistung. Der Aufruf von prepare() kann beispielsweise lange dauern, da er das Abrufen und Decodieren von Mediendaten umfassen kann. Wie bei jeder Methode, deren Ausführung lange dauern kann, sollten Sie sie niemals über den UI-Thread Ihrer Anwendung aufrufen. Dadurch reagiert die Benutzeroberfläche erst wieder, wenn die Methode zurückgegeben wird. Das führt zu einer schlechten Nutzererfahrung und kann einen ANR-Fehler (App antwortet nicht) verursachen.

Um zu vermeiden, dass der UI-Thread hängen bleibt, starten Sie einen weiteren Thread, um das MediaPlayer vorzubereiten, und benachrichtigen Sie den Hauptthread, wenn dies abgeschlossen ist. Das Framework bietet eine praktische Möglichkeit, die Methode prepareAsync() für diese Aufgabe zu verwenden. Mit dieser Methode wird die Vorbereitung der Medien im Hintergrund gestartet und die Methode wird sofort zurückgegeben. Wenn die Vorbereitung der Media abgeschlossen ist, wird die Methode onPrepared() des MediaPlayer.OnPreparedListener aufgerufen, der über setOnPreparedListener() konfiguriert wurde.

Weitere Informationen

Jetpack Media3 ist die empfohlene Lösung für die Medienwiedergabe in Ihrer App. Weitere Informationen

Auf diesen Seiten werden Themen im Zusammenhang mit der Aufnahme, Speicherung und Wiedergabe von Audio- und Videoinhalten behandelt: