Erste Schritte mit dem Media Player

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

Audio- und Videokurse

Die folgenden Klassen spielen Audio 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 die Audioausgabe auf einem Gerät.

Manifesterklärungen

Bevor Sie mit der Entwicklung Ihrer App mit MediaPlayer beginnen, müssen Sie in Ihrem Manifest die entsprechenden Deklarationen hinzufügen, um die Verwendung der zugehörigen Funktionen zu ermöglichen.

  • Internetberechtigung:Wenn Sie Netzwerkinhalte mit dem MediaPlayer streamen, muss Ihre Anwendung den Netzwerkzugriff anfordern.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Wakelock-Berechtigung:Wenn deine Player-App verhindern muss, dass das Display gedimmt oder der Prozessor in den Ruhemodus versetzt wird, oder die Methoden MediaPlayer.setScreenOnWhilePlaying(boolean) oder MediaPlayer.setWakeMode(android.content.Context, int) verwendet, musst du diese Berechtigung anfordern.

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

MediaPlayer-Klasse verwenden

Die Klasse MediaPlayer ist eine wichtige Komponente des Medien-Frameworks. Ein Objekt dieser Klasse kann Audio- und Videoinhalte mit minimaler Einrichtung abrufen, decodieren und wiedergeben. MediaPlayer unterstützt mehrere Medienquellen, darunter:

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

Eine Liste der von Android unterstützten Medienformate finden Sie auf der Seite Unterstützte Medienformate.

Beispiele für die Arbeit mit Audioquellen

Hier ist ein Beispiel für die Wiedergabe von Audio, das als lokale Rohressource verfügbar ist (im Verzeichnis res/raw/ 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 „rohe“ Ressource eine Datei, die vom System nicht auf eine bestimmte Weise geparst wird. Der Inhalt dieser Ressource sollte jedoch kein Rohaudio sein. Es muss 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 abgerufen):

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

Das Abspielen über eine Remote-URL mit 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 Leistungssteigerung verwenden

Beachten Sie die Leistung, wenn Sie MediaPlayer verwenden. So kann beispielsweise der Aufruf von prepare() sehr lange dauern, da möglicherweise Mediendaten abgerufen und decodiert werden müssen. 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 nicht mehr, bis die Methode zurückgegeben wird. Das ist nicht nutzerfreundlich und kann zu einem ANR-Fehler (App antwortet nicht) führen.

Um ein Aufhängen des UI-Threads zu vermeiden, starten Sie einen weiteren Thread, um die MediaPlayer vorzubereiten, und benachrichtigen Sie den Hauptthread, wenn Sie fertig sind. Das Framework bietet eine praktische Möglichkeit, die Methode prepareAsync() für diese Aufgabe auszuführen. Diese Methode startet die Vorbereitung der Medien im Hintergrund und gibt sofort eine Antwort zurück. Wenn die Medien fertig vorbereitet sind, wird die Methode onPrepared() des MediaPlayer.OnPreparedListener aufgerufen, die ü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 finden Sie Themen zum Aufzeichnen, Speichern und Abspielen von Audio- und Videoinhalten: