Android Länge eines Musikordners

Hallo!

Ich brauche für meine App die Gesamtlänge aller Mp3-Dateien in einem Ordner. Momentan lese ich die Länge jeder Datei mit MediaMetadataRetriever aus, und rechne die Längen dann zusammen. Das Problem: es dauert ewig. (also schon ein paar Sekunden). Ich habe noch bei keinem Musikplayer gesehen, das da was geladen hat. Also muss es eine Möglichkeit geben, die Gesamtlänge schneller zu berechnen.
Hat da wer eine Idee?
 
Zuletzt bearbeitet von einem Moderator:
Wie sieht denn dein Code aus? AFAIK ist das schon die "leichtgewichtigste" Version. Möglichkeit für parallele/hintergrund Tasks?
 
Wie sieht denn dein Code aus?
Java:
public long calcTotalDuration(File bookdir) {
    File[] audios = bookdir.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(".mp3");
        }
    });
long duration = 0;
    MediaMetadataRetriever mmdr =new MediaMetadataRetriever();
for(File f : audios) {
    mmdr.setDataSource(f.getAbsolutePath());
    duration += Long.parseLong(mmdr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
}
    return duration;
}
 
Profiling der Methoden wäre nicht schlecht. Sidenote: lt. Doku steht MediaMetadataRetriever#setDataSource: 'May be time-consuming'
Wenn das eben nicht schneller geht, hast du pech gehabt.
 
Aber es geht schneller. Keine Musikplayer App lädt vor dem (ersten) start Ewigkeiten.
Unabhängig vom System gilt in jedem Fall: falls keine anderen Daten als die Datei selbst zur Verfügung stehen, muss die Spieldauer aus der Datei ermittelt werden.

Dazu muss mindestens lesend auf die Datei zugegriffen werden. Im besten Fall sind in der Datei Metadaten gespeichert, die die Spieldauer direkt oder indirekt angeben.

Jede Datei muss also geöffnet, wenigstens teilweise gelesen und in der Regel auch wieder geschlossen werden. Dafür wird je Datei eine gewisse Zeit benötigt.

Beschleunigen lässt sich das nicht, man kann aber zwei Dinge tun:

1. Antwortzeit der Anwendung verringern
2. Daten (künftig) nicht (mehr) aus der Datei ermitteln

Zu 1.: damit ist gemeint, dass man z. B. die Anwendung startet, der Benutzer damit arbeiten kann aber die Gesamtspieldauer noch nicht sieht, weil die Ermittlung im Hintergrund läuft. Erst, wenn das abgeschlossen ist, wird die Spieldauer angezeigt.

Zu 2.: ich kenne mich mit Music-Player auf Smartphone nicht aus. Auf dem Desktop werden aber meist etwas wie "Medien-Bibliotheken" verwaltet, in die man seine Musiksammlung erst einmal importieren muss. Und bei diesem Import kann eben auch die Spieldauer ausgelesen und in z. B. einer Datenbank gespeichert werden. Wenn ich es richtig sehe, gibt es für Android dafür eine zentrale Stelle: den MediaStore.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben