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