Liste de toutes les musiques dans MediaStore avec les chemins

Ok donc je travaille sur ce projet depuis quelques jours maintenant et la plupart de mon temps a été de travailler sur la façon de lister toute la musique sur un appareil dans une vue de liste ou quelque chose d'autre, j'ai cherché pendant quelques jours maintenant et cela me tue. J'ai obtenu tellement près à un moment avec toute la musique dans un dossier montrant, mais puisque la plupart des gens auront des sous-dossiers pour des choses comme artiest et albums j'ai besoin d'un moyen de rechercher des sous-dossiers pour MP3s ou des fichiers de musique.

Voici ce que j'ai donc loin de Music collection:

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

}

Merci à tous ceux qui peuvent aider. :)

26
demandé sur bluish 2012-11-26 20:18:51

3 réponses

bien que le post soit ancien, pour que d'autres personnes comme moi aient l'idée de créer une liste de musique avec leur chemin de fichier, j'ai ajouté la solution ici. MediaStore.Audio.Media.DATA la colonne contient en fait le chemin du fichier média. Vous pouvez obtenir les informations nécessaires en utilisant le code suivant:

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();
27
répondu MARK002-MAB 2014-06-04 02:33:55

Vous pouvez lister tous les fichiers de musique en utilisant ce 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));
}

je n'ai pas essayé ce code, mais il semble correct. Vous serez sur la bonne voie.

19
répondu Vincent Mimoun-Prat 2012-11-27 09:07:03

je travaille sur le même projet en ce moment et j'ai déjà résolu le problème.

Vous aurez besoin d'une classe personnalisée pour stocker vos chansons de données:

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

alors vous devez définir ArrayList en activité avec la vue de liste que vous remplirez avec les données:

private ArrayList<Songs> arrayList;

et dans onCreate:

arrayList = new ArrayList<Songs>();

Ensuite, vous devez récupérer des données à partir de votre appareil:

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

alors appelez cette méthode de onCreate:

YOUR_METHOD_NAME();

Et enfin vous devez créer une classe adaptateur personnalisée, Définir cet adaptateur dans onCreate (en activité avec ListView) et le mettre sur votre objet ListView.

je vois que cela a été demandé il y a 3 ans et le problème je pense déjà résolu, mais peut-être qu'il sera utile pour quelqu'un. Grâce.

2
répondu Levan Voronin 2016-11-12 16:18:49