2010-07-20 10 views
99

Ich habe den folgenden Code:Wiedergabe Audiodatei aus dem Vermögen Verzeichnis

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3"); 
player = new MediaPlayer(); 
player.setDataSource(afd.getFileDescriptor()); 
player.prepare(); 
player.start(); 

Das Problem ist, dass, wenn ich diesen Code ausführen, beginnt es, all Audio-Dateien im Verzeichnis Vermögen spielen, anstatt in alphabetischer Reihenfolge nur die von mir angeforderte Audiodatei abzuspielen. Was mache ich falsch? Gibt es eine bessere Möglichkeit, Audiodateien aus dem Verzeichnis "Assets" abzuspielen?

Nachfragen: Gibt es einen Unterschied zwischen dem Speichern von Audiodateien im Verzeichnis "Assets" und dem Speichern dieser Dateien im res/row-Verzeichnis? Abgesehen davon, dass sie keine IDs erhalten, wenn sie sich im Verzeichnis "Assets" befinden. Wenn ich die Audiodateien in den Ordner res/raw verschiebe, habe ich ein Problem mit der Wiederverwendung von MediaPlayer s, weil es keinen ID-Parameter für setDataSource() gibt. Ich kann keine gute Richtlinie für die Behandlung dieser Art von Problem finden.

Antwort

205
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

Ihre Version funktionieren würde, wenn Sie in dem Vermögen Verzeichnis nur eine Datei haben. Der Inhalt des Inhaltsverzeichnisses ist nicht wirklich "echte Dateien" auf der Festplatte. Sie werden alle nacheinander zusammengestellt. Also, wenn Sie nicht angeben, wo und beginnen, wie viele Bytes zu lesen, wird der Spieler liest bis zum Ende (das heißt, dass alle Dateien in Assets spielt Verzeichnis)

+1

Es hat funktioniert. Vielen Dank. Aber ich denke meine Version SOLLTE auch funktionieren. –

+54

Ihre Version würde funktionieren, wenn Sie nur eine Datei im Anlagenverzeichnis hätten. Der Inhalt des Inhaltsverzeichnisses ist keine tatsächliche Datei auf der Festplatte. Sie werden alle nacheinander zusammengestellt. Also, wenn Sie nicht angeben, wo zu starten und wie viele Bytes zu lesen, wird der Player bis zum Ende lesen (das heißt, wird weiterhin alle Dateien im Verzeichnis Vermögenswerte spielen) –

+0

Sehr gute Antwort! – Redax

57

Diese Funktion funktioniert einwandfrei :)

// MediaPlayer m; /*assume, somewhere in the global scope...*/ 

public void playBeep() { 
    try { 
     if (m.isPlaying()) { 
      m.stop(); 
      m.release(); 
      m = new MediaPlayer(); 
     } 

     AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3"); 
     m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 

     m.prepare(); 
     m.setVolume(1f, 1f); 
     m.setLooping(true); 
     m.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+2

was ist m? Sie initialisieren m = new MediaPlayer(); nach und benutzt es vorher? – Umar

+0

Hi @Umar, ich habe Global Variable MediaPlayer nehmen m = null; dann habe ich in playBeep() die Funktion –

+0

zugewiesen Denken Sie daran, 'MediaPlayer m' muss' statisch' sein oder eine andere ** Referenz ** haben. Wenn Sie "m" in einer Funktion ohne Referenz haben, "GC" wird es "sammeln" –

Verwandte Themen