2012-11-26 10 views
23

Ok, also arbeite ich seit ein paar Tagen an diesem Projekt und die meiste Zeit habe ich daran gearbeitet, die Musik auf einem Gerät in einer LIST VIEW aufzulisten Ansonsten habe ich jetzt ein paar Tage gesucht und das bringt mich um. Ich kam so nah an einen Punkt mit der ganzen Musik in einem Ordner, aber da die meisten Leute Unterordner für Dinge wie Künstler und Alben haben, brauche ich eine Möglichkeit, Unterordner nach MP3s oder Musikdateien zu durchsuchen.Listen Sie alle Musik in MediaStore mit den PATHs

Hier ist, was ich bisher für Musik Sammlung:

package com.androidhive.musicplayer; 

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.HashMap; 

import android.provider.MediaStore; 

public class SongsManager { 
// SDCard Path 
final String MEDIA_PATH = new String(MediaStore.Audio.Media.getContentUri("external").toString()); 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

// Constructor 
public SongsManager(){ 

} 

/** 
* Function to read all mp3 files from sdcard 
* and store the details in ArrayList 
* */ 
public ArrayList<HashMap<String, String>> getPlayList(){ 
    File home = new File(MEDIA_PATH); 

    if (home.listFiles(new FileExtensionFilter()).length > 0) { 
     for (File file : home.listFiles(new FileExtensionFilter())) { 
      HashMap<String, String> song = new HashMap<String, String>(); 
      song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4))); 
      song.put("songPath", file.getPath()); 

      // Adding each song to SongList 
      songsList.add(song); 
     } 
    } 
    // return songs list array 
    return songsList; 
} 

/** 
* Class to filter files which are having .mp3 extension 
* */ 
class FileExtensionFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
     return (name.endsWith(".mp3") || name.endsWith(".MP3")); 
    } 
} 

} 

Dank an alle, die helfen können. :)

+0

Warum erhalten Sie diese Liste nicht aus dem MediaStore? –

+0

Wie würde ich das tun, obwohl ich Media Store versucht habe .. – user1853951

Antwort

17

Sie können alle Liste der Musikdateien this code

//Some audio may be explicitly marked as not being music 
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 

String[] projection = { 
     MediaStore.Audio.Media._ID, 
     MediaStore.Audio.Media.ARTIST, 
     MediaStore.Audio.Media.TITLE, 
     MediaStore.Audio.Media.DATA, 
     MediaStore.Audio.Media.DISPLAY_NAME, 
     MediaStore.Audio.Media.DURATION 
}; 

cursor = this.managedQuery(
     MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
     projection, 
     selection, 
     null, 
     null); 

private List<String> songs = new ArrayList<String>(); 
while(cursor.moveToNext()) { 
     songs.add(cursor.getString(0) + "||" 
        + cursor.getString(1) + "||" 
        + cursor.getString(2) + "||" 
        + cursor.getString(3) + "||" 
        + cursor.getString(4) + "||" 
        + cursor.getString(5)); 
} 

mit habe ich diesen Code nicht ausprobiert, aber es scheint richtig. Damit sind Sie auf dem richtigen Weg.

+0

Hmmm ich habe versucht Ihren Code, obwohl ich nicht scheinen kann, um es zu arbeiten können Sie meinen Code ändern und mir zeigen, wie es getan wird :) Ich würde es selbst tun Ich werde nur meinen Kopf um ihn herum bekommen. – user1853951

+0

@MarvinLabs wissen Sie eine Möglichkeit, Dateipfad aus Mediastore für einen bestimmten Song zu holen? –

+0

Brillanter Code. Ich habe fast 8 Stunden nach einer Lösung gesucht. Vielen Dank. –

26

Obwohl der Beitrag alt ist, für andere Leute wie mich auf die Idee, eine Liste von Musik mit ihrem Dateipfad erstellen, habe ich die Lösung hier hinzugefügt. MediaStore.Audio.Media.DATA Spalte enthält tatsächlich Mediendateipfad. Sie können die erforderlichen Informationen erhalten, indem Sie das folgende Code-Schnipsel verwenden:

+0

@AshishSahu können Sie bitte erklären Sie Ihren Kommentar? Ich habe es mehrmals gelesen und verstehe nicht, was du sagen willst :) –

+0

@ amos-bordowitz Möglicherweise wurde der Code nach Ashishs Kommentar korrigiert und der Kommentar scheint jetzt fehl am Platz :) – Sara

2

Ich arbeite gerade an demselben Projekt und bereits das Problem gelöst.

Sie eine benutzerdefinierte Klasse benötigen, um Ihre Songs Daten zu speichern:

package YOUR_PACKAGE; 

public class Songs 
{ 
    private long mSongID; 
    private String mSongTitle; 

    public Songs(long id, String title){ 
     mSongID = id; 
     mSongTitle = title; 
    } 

    public long getSongID(){ 
     return mSongID; 
    } 

    public String getSongTitle(){ 
     return mSongTitle; 
    } 
} 

Dann müssen Sie Arraylist in der Aktivität mit Listenansicht definieren, die Sie mit Daten füllen werden:

private ArrayList<Songs> arrayList; 

und in onCreate:

arrayList = new ArrayList<Songs>(); 

Dann müssen Sie Daten von Ihrem Gerät abrufen:

public void YOUR_METHOD_NAME(){ 
    ContentResolver contentResolver = getContentResolver(); 
    Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor songCursor = contentResolver.query(songUri, null, null, null, null); 

    if(songCursor != null && songCursor.moveToFirst()) 
    { 
     int songId = songCursor.getColumnIndex(MediaStore.Audio.Media._ID); 
     int songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE); 

     do { 
      long currentId = songCursor.getLong(songId); 
      String currentTitle = songCursor.getString(songTitle); 
      arrayList.add(new Songs(currentId, currentTitle, currentArtist)); 
     } while(songCursor.moveToNext()); 
    } 
} 

Dann diese Methode von onCreate nennen:

YOUR_METHOD_NAME(); 

Und schließlich müssen Sie benutzerdefinierte Adapter-Klasse erstellen, definieren Sie diesen Adapter in onCreate (in Aktivität mit Listview) und stellen Sie diesen Adapter auf Ihrem Listview-Objekt .

Ich sehe, dass es vor 3 Jahren gefragt wurde und das Problem, denke ich, bereits gelöst, aber vielleicht wird es für jemanden nützlich sein. Vielen Dank.

Verwandte Themen