Jan scheint ja ein ähnliches Problem zu haben und da habe ich gedanklich mal die Vorgehensweise skizziert.
https://www.nextpit.de/de/android/forum/thread/500921/Soundboard-Sound-Start-Stop-Reset---------------
Problem1 : mehre Mediaplayer instanzen, also erschaffen wir uns nur einen Mediaplayer und setzen nur das Soundfile neu
Das deklariere ich direkt in meiner Klasse (in deinem Fall MainActivity)
1private MediaPlayer mediaPlayer;
2 private int[] soundliste = {R.raw.toco1, R.raw.toco2, R.raw.toco3};
3
4 private Button but1;
5 private Button but2;
im oncreate erzeugen wir dann ein wenig
1mediaPlayer = new MediaPlayer();
Das Problem der 1000 OnClickhandler hatte ich bereits in Jan seinem Thread angesprochen, das macht den Code schnell unleserlich und schafft Raum für Fehler.
Vorschlag: wir geben der Activty gleich einen Clickhandler mit und "überladen" diese Methode
1public class MainActivity extends Activity implements OnClickListener {
und fügen eine für alles gültige onCLick Methode ein.
1public void onClick(View v) {
2 }
Was jetzt noch fehlt sind die Buttons - der EInfachheit halber habe ich sie einmal nur but1,but2 genannt,
diese sammeln wir uns im onCreate zusammen
1but1 = (Button) findViewById(R.id.button1);
2 but1.setOnClickListener(this);
3
4 but2 = (Button) findViewById(R.id.button2);
5 but2.setOnClickListener(this);
was jetzt noch fehlt ist unsere Abspielroutine und unser Clickhandler.
Der Cllckhandler wird ganz einfach, ich unterscheide die Button und rufe dann meine Soundabspielroutine auf, die ganzen Soundfiles habe ich mir in einem Array zusammen gefasst, somit ist es übersichtlicher und ich kann schneller Sounds austauschen/hinzufügen, was auch immer.
1@Override
2 public void onClick(View v) {
3
4 switch(v.getId()){
5
6 case R.id.button1:
7 spiele_sound(soundliste[0]);
8 break;
9 case R.id.button2:
10 spiele_sound(soundliste[1]);
11 break;
12 }
13 }
Ok und nun die Abspielroutine:
Kleine Warnung im Vorfeld: der Mediaplayer ist viel mächtiger und kann per Listener ect auf Events reagieren, diese habe ich hier nicht eingebaut, sollte aber für die Zukunft eine Option sein. Beispiel - Soundfile ist zu Ende gespielt MediaPlayer.OnCompletionListener.
Ok die Abspielroutine ist sehr einfach gehalten:
-> Index des Soundfiles (aus unserem Array wird übergeben) -> siehe oben
-> es wird geprüft ob der MediaPlayer bereits spielt und bei bedarf gestoppt
-> das neue gewünschte Soundfile wird dem Player zugewiesen und abgespielt
1private void spiele_sound(int resid) {
2
3 if (mediaPlayer.isPlaying()){
4 mediaPlayer.stop();
5 }
6
7 AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(resid);
8
9 try
10 {
11 mediaPlayer.reset();
12 mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
13 mediaPlayer.prepare();
14 mediaPlayer.start();
15 afd.close();
16 }
17 catch (IllegalArgumentException e)
18 {
19 Log.e("KAN", "Unable to play audio queue do to exception: " + e.getMessage(), e);
20 }
21 catch (IllegalStateException e)
22 {
23 Log.e("KAN", "Unable to play audio queue do to exception: " + e.getMessage(), e);
24 }
25 catch (IOException e)
26 {
27 Log.e("KAN", "Unable to play audio queue do to exception: " + e.getMessage(), e);
28 }
29
30 }
Anmerkung:
das ist natürlich alles Quick-n-Dirty und für eine richtige App müssten noch ein paar Sachen rein
-> in das onPause der Actity --- > sollte der Mediaplayer gestoppt werden
-> in der Abspielroutine sollte man den MediaPlayer gg null testen ob er überhaupt noch da ist,
-> naja und so krimskrams halt
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.