Jak uzyskać przycisk do odtwarzania dźwięku z RAW po kliknięciu? Właśnie utworzyłem przycisk z identyfikatorem button1
, ale niezależnie od kodu, który napiszę, wszystko jest nie tak.
import android.media.MediaPlayer;
public class BasicScreenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_basic_screen);
}
Button one = (Button)this.findViewById(R.id.button1);
MediaPlayer = mp;
mp = MediaPlayer.create(this, R.raw.soho);
zero.setOnCliclListener(new View.OnClickListener() )
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.basic_screen, menu);
return true;
}
}
MusicManager.getInstance().play(this, R.raw.my_sound);
. Jeśli tak, ta biblioteka może być dla Ciebie: github.com/delight-im/Android-AudioOdpowiedzi:
To najważniejsza część kodu zawartego w oryginalnym poście.
Aby wyjaśnić to krok po kroku:
Pierwsza to inicjalizacja przycisku używanego do odtwarzania dźwięku. Używamy Aktywności
findViewById
, przekazując identyfikator, który do niej przypisaliśmy (w tym przypadkuR.id.button1
:), aby uzyskać przycisk, którego potrzebujemy. Rzutowaliśmy go jako,Button
aby łatwo było przypisać go do zmiennejone
, którą inicjalizujemy. Więcej wyjaśnienia, jak to działa, nie wchodzi w zakres tej odpowiedzi. To daje wgląd krótko o tym, jak to działa.Oto jak zainicjować plik
MediaPlayer
. MediaPlayer jest zgodny ze wzorcem projektowym metody Static Factory . Aby uzyskać instancję, wywołujemy jejcreate()
metodę i przekazujemy jej kontekst oraz identyfikator zasobu dźwięku, który chcemy odtworzyć, w tym przypadkuR.raw.soho
. Deklarujemy to jakofinal
. Jon Skeet zapewnił świetne wyjaśnienie, dlaczego to robimy tutaj .Na koniec ustalamy, co zrobi nasz poprzednio zainicjowany przycisk. Odtwórz dźwięk po kliknięciu przycisku! Aby to zrobić, ustawiamy
OnClickListener
nasz przyciskone
. Wewnątrz jest tylko jedna metoda,onClick()
która zawiera instrukcje , które przycisk powinien wykonać po kliknięciu .Aby odtworzyć dźwięk, wywołujemy
start()
metodę MediaPlayera . Ta metoda rozpoczyna odtwarzanie dźwięku.Tam możesz teraz odtwarzać dźwięk po kliknięciu przycisku w systemie Android!
Część bonusowa:
Jak zauważono w komentarzu poniżej, dzięki Langusten Gustel! i zgodnie z zaleceniami zawartymi w dokumentacji dla deweloperów systemu Android ważne jest wywołanie
release()
metody w celu zwolnienia zasobów, które nie będą już używane. Zwykle robi się to po zakończeniu odtwarzania odtwarzanego dźwięku. Aby to zrobić, dodajemyOnCompletionListener
do naszegomp
polubienia:Wewnątrz
onCompletion
metody wypuszczamy ją w następujący sposób:Istnieją oczywiście lepsze sposoby realizacji tego. Na przykład możesz uczynić MediaPlayer zmienną klasy i obsługiwać jej cykl życia wraz z cyklem życia
Fragment
lub,Activity
który jej używa. To jednak temat na inne pytanie. Aby zakres tej odpowiedzi był mały, napisałem ją tylko po to, aby zilustrować, jak odtwarzać dźwięk po kliknięciu przycisku w systemie Android .Oryginalny post
Pierwszy. Powinieneś umieścić swoje instrukcje wewnątrz bloku, w tym przypadku metody onCreate.
Druga. Zainicjowałeś przycisk jako zmienną jeden , następnie użyłeś zmiennej zero i ustawiłeś jego onClickListener na niekompletny onClickListener. Użyj zmiennej jeden dla setOnClickListener.
Po trzecie, umieść logikę odtwarzania dźwięku wewnątrz onClick.
W podsumowaniu:
źródło
RELEASE
Przetestowane i działające w 100%
To było wszystko, co musieliśmy zrobić
źródło
Najlepszym sposobem, aby to zrobić, jest tutaj, które znalazłem po wyszukaniu jednego problemu po drugim w LogCat
Brak zwolnienia odtwarzacza multimedialnego powoduje ten błąd w LogCat:
Brak resetowania odtwarzacza multimedialnego powoduje ten błąd w LogCat:
Więc graj bezpieczny i prosty kod, aby korzystać z odtwarzacza multimedialnego.
Aby odtworzyć więcej niż jeden dźwięk w tym samym działaniu / fragmencie, po prostu zmień ResID podczas tworzenia nowego odtwarzacza multimedialnego, takiego jak
i graj!
Baw się dobrze!
źródło
źródło
raw
folderze, jeśli nie istnieje, utwórz go.-
znaków ani znaków specjalnych.W swojej aktywności musisz mieć obiekt
MediaPlayer
, wewnątrzonCreate
metody lubonclick
metody, musisz zainicjowaćMediaPlayer
, na przykładMediaPlayer.create(this, R.raw.name_of_your_audio_file)
, plik audio gotowy do odtworzenia z wywołaniemstart()
, w twoim przypadku, ponieważ chcesz, aby było umieszczony w przycisku, będziesz musiał umieścić go wewnątrzonClick
metody.Przykład:
źródło
jest kilka predefiniowanych dźwięków: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.
Miły!
użyj jak:
źródło
Spróbuj tego, myślę, że zadziała
źródło
utworzyć przycisk z metodą, którą można by wywołać po naciśnięciu przycisku (onCreate),
następnie utwórz zmienną dla klasy (MediaPlayer) ze ścieżką do twojego pliku
na koniec uruchom metodę start w tej klasie
plik zostanie uruchomiony po naciśnięciu przycisku, mam nadzieję, że to było pomocne!
źródło
Zamiast resetować go zgodnie z propozycją DeathRs:
możemy po prostu zresetować MediaPlayer, aby zaczął używać:
źródło
Wszystkie te rozwiązania „brzmią” ładnie i rozsądnie, ale jest jeden duży minus. Co się stanie, jeśli klient pobierze Twoją aplikację i kilkakrotnie naciśnie przycisk?
Twój
MediaPlayer
czasami nie odtwarzać dźwięk jeśli klikniesz przycisk wiele razy.MediaPlayer
Kilka dni temu napotkałem ten problem z wydajnością w klasie.Czy
MediaPlayer
klasa jest bezpieczna do użycia? Nie zawsze. Jeśli masz krótkie dźwięki, lepiej użyćSoundPool
klasy.Oszczędnym i wydajnym rozwiązaniem jest klasa SoundPool, która oferuje wspaniałe funkcje i zwiększa wydajność aplikacji.
SoundPool nie jest tak łatwy w użyciu, jak
MediaPlayer
klasa, ale ma wiele zalet, jeśli chodzi o wydajność i niezawodność.Skorzystaj z tego łącza i dowiedz się, jak używać klasy SoundPool w swojej aplikacji:
https://developer.android.com/reference/android/media/SoundPool
Youtube: Zapisz rozwiązanie
źródło
Kwestia krawędzi: powyżej każda odpowiedź jest prawie poprawna, ale utknąłem w skrajnym przypadku. Jeśli jakikolwiek użytkownik losowo kliknie przycisk kilka razy w ciągu kilku sekund, po odtworzeniu jakiegoś dźwięku przestanie odpowiadać.
Powód: inicjalizacja
Mediaplayer
obiektu jest bardzo kosztowna. Zajmuje się również zasobami ( plikiem audio ), więc zajmuje to trochę czasu. Gdy użytkownicy losowo initialize i wywołanie metodyMediaPlayer
„s metod, takich jakstart()
,stop()
,release()
itp mogą powodowaćIllegalStateException
który wychodził.Rozwiązanie: Dzięki krakaczowi za jego sugestię w komentarzu o Android-Audio . Ma tylko dwie proste klasy java (
MusicManager.java
,SoundManager.java
).Możesz użyć,
MusicManager.java
jeśli chcesz odtwarzać jednorazowe pliki dźwiękowe -Możesz użyć,
SoundManager.java
jeśli chcesz często i szybko odtwarzać wiele dźwięków -źródło