Hallo an Euch da draußen.
Nun ich habe vor einigen Tagen mal mit der Entwicklung einer simplen Android App begonnen.
Zuvor habe ich schon einiges in Java für den PC gemacht. Basics sind also da.
Also es geht um ein Soundboard. Ich habe mich quer durchs Internet gewühlt aber leider keine ausreichende Hilfe gefunden.
Es geht also um folgendes.
Um zu verhindern, dass mit jedem sound ein neues Objekt vom Typ MediaPlayer generiert wird muss ich den MediaPlayer ja als Klassenobjekt erstellen mit
MediaPlayer mp = new MediaPlayer();
So nun hab ich verschiedene Buttons. Jeder Button hat seinen eigenen Listener.
In diesem Listener muss ich dem Mediaplayer ja eine Datei zuordnen.
Hier schonmal meine erste zwischenfrage.
Soll ich die Soundfiles auf der SD Karte ablegen oder in den Raw Ordner packen. Wo genau ist der Unterschied?
Ich nutze mal den Raw Ordner.
So nun öffne ich mein erstes Soundfile mit
mp = MediaPlayer.create(getBaseContext(),fileToPlay);
*fileToPlay ist ein Uri Objekt mit ner Adresse der Form: Uri.parse("android.resource://<package>/raw/soundfile");
mit mp.play() starte ich den Abspielvorgang.
Soweit klappt alles.
Nun muss ich die Ressource ja freigeben, weil ich sonst nach 4-6 Aufrufen keinen Sound mehr höre.
mp.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mp.release();
}
So das funktioniert soweit. Aber nun kann ich 10 Sounds gleichzeitig starten. Ich möchte aber das eventuell laufende Sounds gestoppt werden.
Also müsste zuerst ein mp.stop() aufgerufen werden. Dann allerdings bekomme ich beim zweiten Aufruf eine Exception, weil mp ja durch release nicht mehr existent ist.
Wie bekomme ich das Problem gelöst?
Ich hab schon viel von FileDescriptor und AssetFileDescriptor in diesem Zusammenhang gefunden, aber ich verstehe die Logik dieser Methoden nicht so recht.
Hat jemand ne Idee?
Hier nochmal der Code:
public class SiWSoundboardActivity extends Activity
{
//Objektreferenzen
OnTouchListener playFuddl;
MediaPlayer mp = new MediaPlayer();
//Soundreferenzen
Uri sndfile;
String refsndfuddeln = "android.resource://siw.soundboard/raw/sndfilefuddeln";
/** Startmethode. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listenerErzeugen();
buttonsErzeugen();
}
public void listenerErzeugen()
{
//Listener fuer "Fuddln"
playFuddl = new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
sndfile = Uri.parse(refsndfuddeln);
mediaplayerStarten(sndfile);
};
return true;
}
};
}
public void buttonsErzeugen()
{
//Button fuer "Fuddln"
Button btnplayfuddeln = (Button) findViewById(R.id.BTNsndfuddeln);
btnplayfuddeln.setOnTouchListener(playFuddl);
}
public void mediaplayerStarten(Uri fileToPlay)
{
mp = MediaPlayer.create(getBaseContext(),fileToPlay);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mp.release();
}
});
}
}
Alles anzeigen