Pierwsze kroki z Odtwarzaczem multimediów

W tym dokumencie przedstawiamy podstawowe pojęcia, z którymi warto się zapoznać przed rozpoczęciem pracy z odtwarzaczem multimediów.

Zajęcia z dźwięku i wideo

W platformie Android dźwięk i wideo odtwarzają te klasy:

  • MediaPlayer: ta klasa jest głównym interfejsem API do odtwarzania dźwięku i wideo.
  • 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ę za pomocą MediaPlayer, upewnij się, że plik manifestu zawiera odpowiednie deklaracje umożliwiające korzystanie z powiązanych funkcji.

  • Uprawnienia do internetu: jeśli używasz MediaPlayer do przesyłania strumieniowego treści z sieci, 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 korzysta z 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 niezbędnym elementem platformy multimedialnej. Obiekt tej klasy może pobierać, dekodować i odtwarzać zarówno dźwięk, jak i wideo przy minimalnej konfiguracji. MediaPlayer obsługuje kilka źródeł multimediów, w tym:

  • Zasoby lokalne
  • wewnętrzne identyfikatory URI, np. identyfikator URI, który możesz uzyskać z Content Resolver.
  • Zewnętrzne adresy URL (streaming)

Listę formatów multimediów obsługiwanych przez Androida 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 pierwotny (zapisany 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 analizować w żaden konkretny sposób. Treść tego zasobu nie powinna jednak być surowym dźwiękiem. Powinien to być prawidłowo zakodowany i sformatowany plik multimedialny w jednym z obsługiwanych formatów.

A oto jak możesz odtwarzać treści z identyfikatora URI dostępnego lokalnie w systemie (np. uzyskanego za pomocą 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 zdalnego adresu URL za pomocą strumieniowania 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 przygotowania asynchronicznego do zwiększania 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 obejmować pobieranie i dekodowanie danych multimedialnych. Dlatego, podobnie jak w przypadku każdej metody, której wykonanie może zająć dużo czasu, nigdy nie wywołuj jej z wątku UI aplikacji. W takim przypadku interfejs przestanie odpowiadać, dopóki metoda nie zwróci wartości, co negatywnie wpłynie na wygodę użytkowników i może spowodować błąd ANR (Aplikacja nie odpowiada).

Aby uniknąć zawieszenia wątku UI, utwórz inny wątek, który przygotuje MediaPlayer i powiadomi wątek główny o zakończeniu działania. Framework zapewnia wygodny sposób na wykonanie tego zadania za pomocą metody prepareAsync(). Ta metoda rozpoczyna przygotowywanie multimediów w tle i natychmiast zwraca wynik. Gdy media są gotowe, wywoływana jest metoda onPrepared() interfejsu MediaPlayer.OnPreparedListener skonfigurowanego za pomocą interfejsu setOnPreparedListener().

Więcej informacji

Jetpack Media3 to zalecane rozwiązanie do odtwarzania multimediów w aplikacji. Więcej informacji

Na tych stronach znajdziesz informacje o nagrywaniu, przechowywaniu i odtwarzaniu dźwięku i obrazu: