2014-02-11 10 views
12

Ich versuche, alle Musikdateien in meinem Handy zu holen:Wie filtere ich nur relevante Mediendateien in Android?

Dazu verwende ich:

String[] STAR = {"*"}; 

Uri allExternalSongUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 



Cursor cursor = getContentResolver().query(allExternalSongUri, STAR, selection, null, null); 
if(cursor != null){ 
    if(cursor.moveToFirst()){ 
     do { 
      String songName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 
      Log.i("name", songName); 
     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 
} 

Aber vor Code, abgesehen von Musik-Dateien bekommen, abruft auch einige zusätzliche unnötige Dateien wie * sound_screen_on.mp3 * (das von einer anderen App verwendet & installiert ist).

Problem ist meine native Android-Musik-Player nicht auflisten & spielt diese unnötigen Dateien.

Wie kann ich Dateien wie diese filtern.

+0

Ich denke nicht, dass es möglich ist, weil viele App * .mp3 verwendet, um den Hintergrund-Effekt-Sounds zu spielen. Sogar eine Ringtone App verwendet * .mp3 als Klingelton. Möglicherweise können Sie * .mp3 mit einer Länge von mehr als 1 min holen, was die unerwünschte * .mp3 –

Antwort

10

Sie können filtern mit MediaStore.Audio.AudioColumns class.That wird viel Wert der Audiodatei zurückgeben und Sie können es verwenden.

musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      proj, MediaStore.Audio.Media.DURATION + ">= 60000", null, null); 
  • Filter nach Duration - Die Dauer der Audiodatei, in ms
  • Filter nach Type-Music -Nicht-Null, wenn die Audiodatei ist Musik
  • Filter nach Type-RingTone - Nicht-Null, wenn die Audio-Datei kann ein Klingelton
  • Filter nach Type-Alarm sein - nicht Null, wenn die Audiodatei
ein Alarm sein kann 10

Check for more reference

+1

gute Zusammenfassung reduzieren kann! aufgewertet! Ich denke nicht, dass die Dauer ist zuverlässig (ein wirklich kurzes Lied ist immer noch ein Lied), aber die anderen 3 Spalten sind sehr nützlich –

+0

@chintan khetiya, wenn ich mehrere Abfrage in einer einzigen Abfrage aufrufen möchten, dann ist es möglich? Genauso wie ich Genre-Namen anrufe, die Songs enthalten –

+0

Bitte lies auch hier meine Frage, wenn du antworten kannst ... http://stackoverflow.com/questions/25497983/fetch-genre-name-list-which-have-songs-in -it –

0

nur die Musik, die die _Data ist mehr als ein bestimmter Wert, zum Beispiel 300kb.

1

Mit Ihrem gleichen Code bekomme ich keine unerwünschte Datei.

Normalerweise werden Dateien als ignoriert markiert, daher hat der Medienscanner möglicherweise etwas falsch gemacht oder der Index wurde in Ihrem System nicht aktualisiert.

Sounds, Bilder und andere Mediendateien, die von einer App oder vom System verwendet werden sollen, werden so markiert, dass sie ignoriert werden, indem einfach eine Datei namens ".nomedia" in dasselbe Verzeichnis eingefügt wird. Wie Sie in der Dokumentation des MediaStore provider

public static final String MEDIA_IGNORE_FILENAME

Added in API-Ebene 9 Name der Datei Signalisierung der Medien Scanner ignorieren Medien in das Verzeichnis enthält und dessen Unterverzeichnissen lesen kann. Entwickler sollten dies verwenden, um zu vermeiden, dass Anwendungsgrafiken in der Galerie angezeigt werden und ebenfalls Anwendungsklänge und Musik von in der Musik-App angezeigt werden.

Konstanter Wert: „.nomedia“

Also, neben der Ratschläge von chintan khetiya, die groß sind, wahrscheinlich kann man bedenkt, dass es einige Dateien markiert sind ignoriert werden, die nicht wirklich werden ignoriert, und überprüfen Sie es selbst.

einfach, wenn Sie den Cursor laufen, für jede Datei überprüfen, nur wenn im selben Verzeichnis eine Datei dort wie der Wert von MediaStore.MEDIA_IGNORE_FILENAME oder fest codierten .nomedia

2

Abgesehen von den oben genannten Methoden vorgeschlagen durch andere genannt ist, Wenn die Spalte aus der Datenbank nicht zuverlässig ist, können Sie MediaMetadataRetriever immer verwenden, um die gewünschten Informationen nach der ersten Filterung aus der Datenbank abzurufen.

http://developer.android.com/reference/android/media/MediaMetadataRetriever.html

Das ist natürlich langsamer als immer vorhandenen Informationen aus den Medien db, aber es wird Ihnen Autor/Album/Dauer etc andere Informationen und Sie können benutzerdefinierte Filter tun, wie Sie mit der Datei bekommen Liste, die Sie vom ContentProvider erhalten.

Verwandte Themen