web-dev-qa-db-fra.com

Lister toute la musique dans MediaStore avec les PATH

Ok, donc je travaille sur ce projet depuis quelques jours maintenant et la plupart du temps, je me suis demandé comment répertorier toute la musique d’un appareil dans une VUE LISTE ou autre chose, j’ai cherché quelques jours maintenant et ça me tue. Je me suis tellement rapproché à un moment donné avec toute la musique dans un dossier. Cependant, comme la plupart des gens auront des sous-dossiers pour des articles comme Artiest et des albums, j'ai besoin d'un moyen de rechercher des sous-dossiers de fichiers MP3 ou musicaux.

Voici ce que j'ai jusqu'ici pour la collection de musique: 

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. :)

29
user1853951

Bien que la publication soit ancienne, pour que d'autres personnes comme moi aient eu l'idée de créer une liste de musique avec leur chemin de fichier, j'ai ajouté la solution ici. La colonne MediaStore.Audio.Media.DATA contient en fait le chemin du fichier multimédia. Vous pouvez obtenir les informations nécessaires à l'aide de l'extrait 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();
29
MARK002-MAB

Vous pouvez lister tous les fichiers de musique avec 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 avec ça.

20

Je travaille actuellement sur le même projet et j'ai déjà résolu le problème.

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

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

Ensuite, vous devez définir ArrayList en activité avec List View que vous allez renseigner avec des données:

private ArrayList<Songs> arrayList;

et dans onCreate:

arrayList = new ArrayList<Songs>();

Ensuite, vous devez récupérer les données 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());
    }
}

Puis appelez cette méthode depuis onCreate:

YOUR_METHOD_NAME();

Enfin, vous devez créer une classe d'adaptateur personnalisée, définir cet adaptateur dans onCreate (en activité avec ListView) et définir cet adaptateur sur votre objet ListView.

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

2
Levan Voronin

Voici une fonction simple qui vous donne tous les fichiers audio dans File Object.

 public static List<File> getAllAudios(Context c) {
    List<File> files = new ArrayList<>();
    String[] projection = { MediaStore.Audio.AudioColumns.DATA ,MediaStore.Audio.Media.DISPLAY_NAME};
    Cursor cursor = c.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
    try {
        cursor.moveToFirst();
        do{
            files.add((new File(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)))));
        }while(cursor.moveToNext());

        cursor.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return files;
}
0
Bilal Mustafa