0

Oder muss ich es ständig wieder herstellen?Gibt es eine Möglichkeit, eine Sound-Ressource (MediaPlayer) mehr als einmal gleichzeitig von derselben Instanz abzuspielen?

Ich habe eine Sounddatei, die jedes Mal, wenn ein Schiff explodiert, eine Explosion spielt, aber manchmal können drei oder mehr Schiffe gleichzeitig explodieren, also möchte ich den gleichen Soundclip überlappen. Ich merke, dass es das nicht tun wird, wenn ich keine neuen Instanzen erstelle. Gibt es etwas, das mir fehlt oder ist das der einzige Weg?

//declaration 
private final MediaPlayer[] explosionSound = new MediaPlayer[5]; 

//constructor 
for (int i = 0; i < 5; i++) 
{ 
    explosionSound[i] = MediaPlayer.create(app, R.raw.explosion); 
} 

//in program where I want to use it (when I want to play the sound) 
for (int i = 0; i < 5; i++) 
{ 
    if (!explosionSound[i].isPlaying()) 
    { 
     explosionSound[i].start(); 
     break; 
    } 
} 

//onDestroy() method to release the media 
for (int i = 0; i < 5; i++) 
{ 
    explosionSound[i].release(); 
} 

Ich habe versucht, ein neues anonym zu instanziiert aber es darüber beschwert nicht (der Fehler geht weg, wenn Sie loslassen im onDestroy() -Methode) freigegeben wird. Ich kann es nicht sofort veröffentlichen, sonst spielt der Sound überhaupt nicht. Ich möchte mich auch nicht auf 5 Explosionen beschränken. Jetzt mache ich mir Sorgen um Speicherprobleme.

Gibt es eine einfachere Möglichkeit, dies zu tun?

Antwort

1

Der MediaPlayer soll nicht das Problem kleiner, überlappender Audioclips lösen. Es ist mehr für lang laufende Medien, sowohl Audio als auch Video.

Ein besseres Werkzeug für Ihre spezielle Situation ist SoundPool, das speziell für Ihren Fall entwickelt wurde.

+0

Ich bemerke, um SoundPool zu verwenden, ich muss auch AudioAttributes verwenden, die API 21 erfordert. Gerade jetzt, mit MediaPlayer, funktioniert meine minimale API von 8. Ist SoundPool die einzige Option, die API 21 oder höher benötigt? Ich möchte, dass meine App auch auf älteren Telefonen funktioniert. –

+0

Alle Methoden von SoundPool sind seit API Level 8 verfügbar, die meisten von früher. Sie können das in den Dokumenten sehen, mit denen ich verlinkt bin. –