Probleme mit mediaplayer Klasse

  • Antworten:2
Marc
  • Forum-Beiträge: 2

24.12.2011, 23:04:38 via Website

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:

1public class SiWSoundboardActivity extends Activity
2{
3 //Objektreferenzen
4 OnTouchListener playFuddl;
5 MediaPlayer mp = new MediaPlayer();
6
7 //Soundreferenzen
8 Uri sndfile;
9 String refsndfuddeln = "android.resource://siw.soundboard/raw/sndfilefuddeln";
10
11 /** Startmethode. */
12 @Override
13 public void onCreate(Bundle savedInstanceState)
14 {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main);
17
18 listenerErzeugen();
19 buttonsErzeugen();
20 }
21
22 public void listenerErzeugen()
23 {
24 //Listener fuer "Fuddln"
25 playFuddl = new OnTouchListener()
26 {
27 @Override
28 public boolean onTouch(View v, MotionEvent event)
29 {
30 if (event.getAction() == MotionEvent.ACTION_DOWN)
31 {
32 sndfile = Uri.parse(refsndfuddeln);
33 mediaplayerStarten(sndfile);
34 };
35 return true;
36 }
37 };
38 }
39
40 public void buttonsErzeugen()
41 {
42 //Button fuer "Fuddln"
43 Button btnplayfuddeln = (Button) findViewById(R.id.BTNsndfuddeln);
44 btnplayfuddeln.setOnTouchListener(playFuddl);
45 }
46
47 public void mediaplayerStarten(Uri fileToPlay)
48 {
49 mp = MediaPlayer.create(getBaseContext(),fileToPlay);
50 mp.start();
51
52 mp.setOnCompletionListener(new OnCompletionListener()
53 {
54 @Override
55 public void onCompletion(MediaPlayer mp)
56 {
57 mp.release();
58 }
59
60 });
61
62 }
63}

Antworten
Florian B.
  • Forum-Beiträge: 284

25.12.2011, 12:04:59 via Website

Ich habe zwar noch nie was mit dem MediaPlayer gemacht, aber bist du dir sicher, dass du den wirklich nach jedem Abspielen einer Datei releasen musst? Nach den Docs zu der MediaPlayer Klasse hört es sich eher so an als müsste man den MediaPlayer releasen wenn man den MediaPlayer Objekt an sich nicht mehr benötigt, aber nicht um eine andere Sounddatei ab zu spielen. Somit müsstest du doch mit einem MediaPlayer auskommen und bräuchtest keine 10 Stück, da du ja die Sounds eh nicht parallel abspielen willst.

Antworten