Odtwarzaj dźwięk po kliknięciu przycisku Android

109

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;
    }



}
Dmitrij
źródło
1
Prawdopodobnie chciałbyś, aby zasoby były zarządzane automatycznie, aby móc dzwonić MusicManager.getInstance().play(this, R.raw.my_sound);. Jeśli tak, ta biblioteka może być dla Ciebie: github.com/delight-im/Android-Audio
caw

Odpowiedzi:

228

To najważniejsza część kodu zawartego w oryginalnym poście.

Button one = (Button) this.findViewById(R.id.button1);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        mp.start();
    }
});

Aby wyjaśnić to krok po kroku:

Button one = (Button) this.findViewById(R.id.button1);

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 przypadku R.id.button1:), aby uzyskać przycisk, którego potrzebujemy. Rzutowaliśmy go jako, Buttonaby łatwo było przypisać go do zmiennej one, 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.

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);

Oto jak zainicjować plik MediaPlayer. MediaPlayer jest zgodny ze wzorcem projektowym metody Static Factory . Aby uzyskać instancję, wywołujemy jej create()metodę i przekazujemy jej kontekst oraz identyfikator zasobu dźwięku, który chcemy odtworzyć, w tym przypadku R.raw.soho. Deklarujemy to jako final. Jon Skeet zapewnił świetne wyjaśnienie, dlaczego to robimy tutaj .

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

Na koniec ustalamy, co zrobi nasz poprzednio zainicjowany przycisk. Odtwórz dźwięk po kliknięciu przycisku! Aby to zrobić, ustawiamy OnClickListenernasz przycisk one. Wewnątrz jest tylko jedna metoda, onClick()która zawiera instrukcje , które przycisk powinien wykonać po kliknięciu .

public void onClick(View v) {
    mp.start();
}

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ć, dodajemy OnCompletionListenerdo naszego mp polubienia:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

Wewnątrz onCompletionmetody wypuszczamy ją w następujący sposób:

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

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 Fragmentlub, Activityktó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:

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

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);
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
        one.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                mp.start();
            }
        });
    }
}
Keale
źródło
1
A tak przy okazji, to one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Nie przegap tego!
Auto-Droid ツ
7
nie RELEASE
daj się
38

Przetestowane i działające w 100%

public class MainActivity extends ActionBarActivity {
    Context context = this;
    MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mp = MediaPlayer.create(context, R.raw.sound);
        final Button b = (Button) findViewById(R.id.Button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    if (mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                        mp = MediaPlayer.create(context, R.raw.sound);
                    } mp.start();
                } catch(Exception e) { e.printStackTrace(); }
            }
        });
    }
}

To było wszystko, co musieliśmy zrobić

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}
DeathRs
źródło
Działa to również podczas ponownego odtwarzania dźwięku. Podczas odtwarzania dźwięku myślę, że mp.start () będzie działać bez bloków try / catch i if.
khwilo
37

Najlepszym sposobem, aby to zrobić, jest tutaj, które znalazłem po wyszukaniu jednego problemu po drugim w LogCat

MediaPlayer mp;
mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

Brak zwolnienia odtwarzacza multimedialnego powoduje ten błąd w LogCat:

Android: MediaPlayer sfinalizowany bez wydania

Brak resetowania odtwarzacza multimedialnego powoduje ten błąd w LogCat:

Android: mediaplayer odszedł z nieobsługiwanymi zdarzeniami

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

mp = MediaPlayer.create(context, R.raw.sound_two);

i graj!

Baw się dobrze!

sud007
źródło
8
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    MediaPlayer mp;
    Button one;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mp = MediaPlayer.create(this, R.raw.soho);
        one = (Button)this.findViewById(R.id.button1);

        one.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mp.start();
            }
        });
    }
}
Auto-Droid ツ
źródło
Oto wynik, znowu nic nie działa dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry
Nie potrzebujesz linii mp = new MediaPlayer (), ponieważ inicjalizujesz ją ponownie za pomocą MediaPlayer.create (...) w następnej linii.
Keale
6
  • Dźwięk musi być umieszczony w raw folderze, jeśli nie istnieje, utwórz go.
  • Folder RAW musi znajdować się w folderze res
  • Nazwa nie może zawierać żadnych -znaków ani znaków specjalnych.

W swojej aktywności musisz mieć obiekt MediaPlayer, wewnątrz onCreatemetody lub onclickmetody, musisz zainicjować MediaPlayer, na przykład MediaPlayer.create(this, R.raw.name_of_your_audio_file), plik audio gotowy do odtworzenia z wywołaniem start(), w twoim przypadku, ponieważ chcesz, aby było umieszczony w przycisku, będziesz musiał umieścić go wewnątrz onClickmetody.

Przykład:

private Button myButton;
private MediaPlayer mp;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        mp = MediaPlayer.create(this, R.raw.gunshot);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
}
}
res
źródło
3

jest kilka predefiniowanych dźwięków: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Miły!

MediaActionSound

Klasa do generowania dźwięków, które odpowiadają dźwiękom wytwarzanym przez różne czynności wykonywane przez interfejsy API mediów i aparatu. Dokumenty

użyj jak:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
Dan Alboteanu
źródło
2
Button button1=(Button)findViewById(R.id.btnB1);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer mp1 = MediaPlayer.create(this, R.raw.b1);
mp1.start();
}
});

Spróbuj tego, myślę, że zadziała

Uzzal Prasad
źródło
1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

        MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
        mp.start();

    }

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

MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);

na koniec uruchom metodę start w tej klasie

mp.start();

plik zostanie uruchomiony po naciśnięciu przycisku, mam nadzieję, że to było pomocne!

NEC
źródło
3
Witamy w Stack Overflow! Byłoby lepiej, gdybyś dodał wyjaśnienia i komentarze do swojego kodu, aby przyszli czytelnicy mogli się od Ciebie uczyć.
Mehdi Bounya
1

Zamiast resetować go zgodnie z propozycją DeathRs:

if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();

możemy po prostu zresetować MediaPlayer, aby zaczął używać:

if (mp.isPlaying()) {
       mp.seekTo(0)
}
Mikołaj Karwowski
źródło
1

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.

MediaPlayerKilka dni temu napotkałem ten problem z wydajnością w klasie.

Czy MediaPlayerklasa jest bezpieczna do użycia? Nie zawsze. Jeśli masz krótkie dźwięki, lepiej użyć SoundPoolklasy.

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 MediaPlayerklasa, 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

TheScribbler2019
źródło
0

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 Mediaplayerobiektu jest bardzo kosztowna. Zajmuje się również zasobami ( plikiem audio ), więc zajmuje to trochę czasu. Gdy użytkownicy losowo initialize i wywołanie metody MediaPlayer„s metod, takich jak start(), stop(), release()itp mogą powodować IllegalStateExceptionktó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.javajeśli chcesz odtwarzać jednorazowe pliki dźwiękowe -

MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);

Możesz użyć, SoundManager.javajeśli chcesz często i szybko odtwarzać wiele dźwięków -

class MyActivity extends Activity {

    private SoundManager mSoundManager;

    @Override
    protected void onResume() {
        super.onResume();

        int maxSimultaneousStreams = 3;
        mSoundManager = new SoundManager(this, maxSimultaneousStreams);
        mSoundManager.start();
        mSoundManager.load(R.raw.my_sound_1);
        mSoundManager.load(R.raw.my_sound_2);
        mSoundManager.load(R.raw.my_sound_3);
    }

    private void playSomeSound() {
        if (mSoundManager != null) {
            mSoundManager.play(R.raw.my_sound_2);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mSoundManager != null) {
            mSoundManager.cancel();
            mSoundManager = null;
        }
    }

}
Gk Mohammad Emon
źródło