Pierwsze kroki z Odtwarzaczem multimediów

Ten dokument przedstawia podstawowe zagadnienia, które powinieneś znać przed rozpoczęciem pracy z odtwarzaczem multimediów.

zajęcia dotyczące dźwięku i obrazu;

Te klasy odtwarzają dźwięk i obraz w ramach platformy Android:

  • MediaPlayer: ta klasa jest głównym interfejsem API do odtwarzania dźwięku i obrazu.
  • AudioManager: ta klasa zarządza źródłami dźwięku i wyjściem audio na urządzeniu.

Deklaracje w pliku manifestu

Zanim zaczniesz tworzyć aplikację korzystającą z MediaPlayera, sprawdź, czy w pliku manifestu znajdują się odpowiednie deklaracje umożliwiające korzystanie z powiązanych funkcji.

  • Dostęp do internetu: jeśli używasz MediaPlayera do strumieniowego przesyłania treści sieciowych, aplikacja musi poprosić o dostęp do sieci.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Uprawnienie do blokady uśpienia: jeśli aplikacja odtwarzacza musi zapobiegać przyciemnianiu ekranu lub usypianiu procesora albo używa metod MediaPlayer.setScreenOnWhilePlaying(boolean) lub MediaPlayer.setWakeMode(android.content.Context, int), musisz poprosić o to uprawnienie.

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

Korzystanie z klasy MediaPlayer

Klasa MediaPlayer jest kluczowym elementem frameworku mediów. Obiekt tej klasy może pobierać, dekodować i odtwarzać zarówno dźwięk, jak i obraz z minimalną konfiguracją. MediaPlayer obsługuje kilka źródeł multimediów, w tym:

  • Zasoby lokalne
  • Identyfikatory URI wewnętrzne, takie jak te, które można uzyskać z rozwiązania Content Resolver
  • Adresy URL zewnętrzne (transmisja strumieniowa)

Listę obsługiwanych formatów multimediów znajdziesz na stronie Obsługiwane formaty multimediów.

Przykłady pracy ze źródłami dźwięku

Oto przykład odtwarzania dźwięku dostępnego jako lokalny zasób nieprzetworzony (zapisywany w katalogu res/raw/ aplikacji):

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

W tym przypadku „surowy” zasób to plik, którego system nie próbuje przeanalizować w żaden szczególny sposób. Zawartość tego zasobu nie może jednak stanowić surowego dźwięku. Plik multimedialny powinien być poprawnie zakodowany i sformatowany w jednym z obsługiwanych formatów.

A tak możesz odtwarzać treści z identyfikatora URI dostępnego lokalnie w systemie (na przykład z rozwiązania 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();

Odtwarzanie z odległego adresu URL przy użyciu strumieniowego przesyłania danych przez HTTP wygląda tak:

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

Używanie asynchronicznej przygotowywania do poprawy wydajności

Pamiętaj o wydajności, gdy używasz MediaPlayer. Na przykład wywołanie prepare() może zająć dużo czasu, ponieważ może wymagać pobierania i dekodowania danych multimedialnych. Podobnie jak w przypadku każdej metody, która może wymagać długiego czasu na wykonanie, nigdy nie wywołuj jej z wątku interfejsu użytkownika aplikacji. W efekcie interfejs przestaje odpowiadać, dopóki metoda nie zwróci wyniku. Jest to niewygodne dla użytkownika i może spowodować błąd typu ANR (aplikacja nie odpowiada).

Aby uniknąć zawieszania wątku interfejsu użytkownika, utwórz nowy wątek, który przygotuje dane MediaPlayer, i poinformuj o tym wątek główny. Framework zapewnia wygodny sposób wykonania metody prepareAsync() do wykonania tego zadania. Ta metoda rozpoczyna przygotowywanie multimediów w tle i zwraca dane natychmiast. Gdy media są gotowe, wywoływana jest metoda onPrepared() klasy MediaPlayer.OnPreparedListener skonfigurowanej za pomocą metody setOnPreparedListener().

Więcej informacji

Jetpack Media3 to zalecane rozwiązanie do odtwarzania multimediów w aplikacji. Dowiedz się więcej o tej usłudze.

Na tych stronach znajdziesz informacje na temat nagrywania, przechowywania i odtwarzania dźwięku i obrazu: