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)lubMediaPlayer.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: