Przy budowie mojej ostatniej małej aplikacji na Androida napotkałem problem z używaniem biblioteki MediaPlayer. Oczywiście pierwszym miejscem w jakim trzeba szukać pomocy w przypadku Androida jest strona developer.android.com. Znajdujemy tak całą stronę o odtwarzaniu mediów i o API MediaPlayer. Gdy chcemy odtworzyć dźwięk za pomocą tej biblioteki wystarczą nam 2 linijki kodu:
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file); mediaPlayer.start();
Metoda create przyjmuje jako pierwszy parametr kontekst, natomiast w drugim mieści się lokalizacja pliku dźwiękowego. W tym przypadku jest on umieszczony w folderze res i podfolderze raw, natomiast nazwa pliku to sound_file. Zauważcie, że nie podajemy rozszerzenia pliku.
No i pięknie, wszystko działa. Schody zaczynają się, gdy chcemy w tym samym odtwarzaczu zmieniać odtwarzane pliki. Kombinowałem z dużą ilością rozwiązań, aż w końcu trafiłem na to konkretne. Najpierw pokażę Wam kod, a później przejdę do opisu:
MediaPlayer mediaPlayer = new MediaPlayer(); String filename = "android.resource://" + context.getPackageName() + "/raw/sound_file"; mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.setDataSource(context, Uri.parse(filename)); } catch (Exception e) {} try { mediaPlayer.prepare(); } catch (Exception e) {} mediaPlayer.start();
W pierwszej linijce tworzymy nową instancję klasy MediaPlayer. Następnie musimy stworzyć String w którym przechowamy ścieżkę naszego pliku dźwiękowego. Jest ona taka sama jak w pierwszym przykładzie. To co jest podstawiane do tego stringa wymaga wyjaśnienia. „android.resource://” podaje, że będziemy korzystać z zasobów naszej aplikacji. Następnie metodą getPackageName()
pobieramy nazwę naszego pakietu w którym znajduje się nasz aplikacja. Teoretycznie moglibyśmy to wklepać ręcznie, ale jeśli można to pobrać metodą, to czemu nie. Następnie dodajemy podfolder z folderu res oraz nazwę pliku, który chcemy odtworzyć.
Po co to wszystko? O tym zaraz, bo najpierw musimy ustawić typ jaki chcemy odtworzyć. W naszym przypadku jest to plik dźwiękowy.
Teraz możemy zając się dalej wyjaśnianiem po co był nam ten cały dziwny string. Był on nam potrzebny do tego, żeby teraz ustawić źródło naszego odtwarzacza metodą setDataSource()
. Jako pierwsza przyjmuje ona kontekst aplikacji, natomiast drugim parametrem jest uri naszego pliku. Jednak, my nie mamy uri tylko string w którym przetrzymywana jest ścieżka pliku. Aby zamienić string na uri musimy sparsować string do uri za pomocą metody Uri.parse()
.
Należy jednak obsłużyć wyjątek, który może generować nasza metoda setDataSource()
. Całość została pokazana w linijce 6.
Wyjątek należy również obsłużyć przy użyciu metody prepare()
która, jak sama nazwa wskazuje przygotowuje nasz odtwarzacz do odtwarzania multimediów.
Teraz nie zostało nam nic innego, jak tylko wywołać metodę start()
, aby zacząć odtwarzać nasz plik dźwiękowy.
Należy również pamiętać, aby przed zmianą odtwarzanego pliku zresetować nasz odtwarzacz metodą reset()
.
mediaPlayer.reset();
Jest to bardzo ważne, bo po zmianie pliku i wznowieniu odtwarzania, bez dopisania tej linijki nasz odtwarzacz nie będzie działał poprawnie.
W tym miejscu chciałbym również wspomnieć o możliwości zapętlania dźwięku jaką daje nam API MediaPlayer. Była ona kluczowa dla działania mojej aplikacji. Aby powiedzieć naszemu odtwarzaczowi, że chcemy zapętlić dźwięk wystarczy jedynie dopisać poniższą linijkę przed wywołaniem metody prepare()
i start()
mediaPlayer.setLooping(true);
Jestem świadomy, że prawdopodobnie istnieją lepsze/bardziej „czyste” metody na odtwarzanie plików, jednak dla mnie akurat ta się sprawdziła. Jeśli macie jakieś prostsze/efektywniejsze rozwiązania to podzielcie się nimi w komentarzu.