sobre - manual de programacion android
Listar toda la música en MediaStore con los PATHs (4)
Aquí hay una función simple que te da todos los archivos de audio en Objeto de archivo.
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; }
Bien, he estado trabajando en este proyecto durante unos días y la mayor parte de mi tiempo he estado trabajando en cómo hacer una lista de toda la música en un dispositivo en una VISTA DE LISTA o algo más. He buscado unos días ahora y esto me está matando. Me acerqué tanto en un punto con toda la música que se muestra en una carpeta, aunque como la mayoría de las personas tendrá subcarpetas para cosas más artísticas y álbumes, necesito una forma de buscar subcarpetas para archivos MP3 o de música.
Esto es lo que tengo hasta ahora para la colección de música:
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"));
}
}
}
Gracias a cualquiera que pueda ayudar. :)
Aunque la publicación es antigua, para que otras personas como yo tengan la idea de crear una lista de música con su ruta de archivo, agregué la solución aquí. MediaStore.Audio.Media.DATA
columna MediaStore.Audio.Media.DATA
realidad contiene la ruta del archivo de medios. Puede obtener la información necesaria utilizando el siguiente fragmento de código:
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();
Estoy trabajando en el mismo proyecto en este momento y ya resolví el problema.
Necesitará una clase personalizada para almacenar los datos de sus canciones:
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;
}
}
Luego, debe definir ArrayList en la actividad con la Vista de lista que llenará con los datos:
private ArrayList<Songs> arrayList;
y en onCreate:
arrayList = new ArrayList<Songs>();
Entonces tienes que recuperar datos de tu 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());
}
}
Entonces llama a este método desde onCreate:
YOUR_METHOD_NAME();
Y finalmente, tiene que crear una clase de adaptador personalizado, definir este adaptador en onCreate (en actividad con ListView) y configurar este adaptador en su objeto ListView.
Veo que se preguntó hace 3 años y el problema creo que ya se resolvió, pero tal vez sea útil para alguien. Gracias.
Puedes listar todos los archivos de música usando este código
//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));
}
No he probado este código, pero me parece correcto. Estarás en el camino correcto con eso.