2012-11-26 5 views
23

Ok, quindi ho lavorato a questo progetto per alcuni giorni e la maggior parte del mio tempo ha lavorato su come elencare tutta la musica su un dispositivo in LIST VIEW o qualcosa del genere altrimenti, ho cercato per alcuni giorni e questo mi sta uccidendo. Mi sono avvicinato così tanto a un certo punto con tutta la musica in una cartella mostrata, anche se dal momento che molte persone hanno sottocartelle per cose come artiest e album ho bisogno di un modo per cercare sottocartelle per MP3 o file musicali.Elenco di tutti i brani musicali in MediaStore con i PERCORSI

Ecco quello che ho finora per la raccolta di musica:

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")); 
    } 
} 

} 

Grazie a tutti coloro che possono aiutare. :)

+0

Perché non ottenere quell'elenco dal MediaStore? –

+0

come avrei fatto se avessi provato il media store .. – user1853951

risposta

17

è possibile elencare tutti i file musicali utilizzando 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)); 
} 

Non ho provato questo codice, ma sembra corretto. Sarai sulla buona strada con quello.

+0

Hmmm ho provato il tuo codice anche se non riesco a farlo funzionare potresti modificare il mio codice e mostrarmi come è fatto :) lo farei anch'io mi sono appena fatto girare la testa. – user1853951

+0

@MarvinLabs conosci un possibile modo per recuperare il percorso del file dal mediastore ?? per una canzone particolare? –

+0

Codice brillante. Ho cercato circa 8 ore per una soluzione. Grazie. –

26

Anche se il post è vecchio, per altre persone come me, per avere l'idea di creare un elenco di musica con il loro percorso file, ho aggiunto la soluzione qui. La colonna MediaStore.Audio.Media.DATA contiene effettivamente il percorso del file multimediale. È possibile ottenere le informazioni necessarie utilizzando il seguente frammento:

ContentResolver cr = getActivity().getContentResolver(); 

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; 
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; 
Cursor cur = cr.query(uri, null, selection, null, sortOrder); 
int count = 0; 

if(cur != null) 
{ 
    count = cur.getCount(); 

    if(count > 0) 
    { 
     while(cur.moveToNext()) 
     { 
      String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA)); 
      // Add code to get more column here 

      // Save to your list here 
     } 

    } 
} 

cur.close(); 
+0

@AshishSahu puoi spiegare il tuo commento? L'ho letto diverse volte e non capisco cosa stai cercando di dire :) –

+0

@ amos-bordowitz Il codice potrebbe essere corretto dopo il commento di Ashish e il commento sembra fuori luogo ora :) – Sara

2

su cui sto lavorando allo stesso progetto in questo momento e già risolto il problema.

Avrete bisogno di una classe personalizzata per memorizzare i dati di canzoni:

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; 
    } 
} 

Poi è necessario definire ArrayList in attività con la lista Visualizza il quale vi compilare con i dati:

private ArrayList<Songs> arrayList; 

e in onCreate:

arrayList = new ArrayList<Songs>(); 

Quindi è necessario recuperare i dati dal dispositivo:

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()); 
    } 
} 

Quindi chiamare questo metodo da onCreate:

YOUR_METHOD_NAME(); 

E infine è necessario creare una classe adattatore personalizzato, definire questo adattatore a onCreate (in attività con ListView) e impostare questo adattatore sul vostro oggetto ListView .

Vedo che è stato chiesto 3 anni fa e il problema penso già risolto, ma forse sarà utile per qualcuno. Grazie.

Problemi correlati