es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener la ruta del URI desde un cursor en MediaStore.

Estoy intentando hacer un reproductor de medios y el primer paso para eso es escanear todas las canciones disponibles en el almacenamiento externo del dispositivo. Después de eso, las almacenaré en una lista, pero me quedé atascado en este primer punto. (No estoy familiarizado con Uri o Cursor, así que realmente no sé cómo funcionan incluso después de investigar en Google y Stackoverflow durante un tiempo, y tal vez ese sea el problema)

Quiero poder almacenar cada canción que el cursor obtenga en una lista de una clase Song, que tendrá artista, álbum, título, duración y ruta. Quiero usar la ruta más tarde para reproducir la canción con mediaPlayer.setDataSource (ruta); pero no sé cómo obtenerla.

protected void getSongs() {

ContentResolver contentResolver = this.getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri,null,MediaStore.Audio.Media.IS_MUSIC + " = 1",null,null);

if (cursor!=null&&cursor.moveToFirst()){
//obtener índice de las columnas
int artistColumn=cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int albumColumn=cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
int titleColumn=cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int durationColumn=cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
//obtener la ruta de algún modo
}
else {
Toast.makeText(this, "La consulta falló", Toast.LENGTH_SHORT).show();
}

El método no está terminado. Sé que me faltan un par de cosas, pero la única duda que no puedo resolver es la ruta del elemento actual del cursor.

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la ruta del elemento del cursor actual, puedes usar cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)). Esto recuperará la ruta del archivo de la canción actual. Puedes almacenarlo como una cadena en tu clase Canción.

    Aquí hay un fragmento de código actualizado:

    protected void getSongs() {
    
        ContentResolver contentResolver = this.getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = contentResolver.query(uri,null,MediaStore.Audio.Media.IS_MUSIC + " = 1",null,null);
    
        if (cursor!=null && cursor.moveToFirst()){
            //Recuperar índice de las columnas
            int artistColumn = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
            int albumColumn = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
            int titleColumn = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
            int durationColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
            int pathColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
    
            ArrayList<canción> listaDeCanciones = new ArrayList<>();
    
            do {
                //Obtener datos del cursor
                String artista = cursor.getString(artistColumn);
                String album = cursor.getString(albumColumn);
                String título = cursor.getString(titleColumn);
                long duración = cursor.getLong(durationColumn);
                String ruta = cursor.getString(pathColumn);
    
                //Crear objeto canción
                Canción canción = new Canción(artista, album, título, duración, ruta);
    
                //Agregar canción a la lista
                listaDeCanciones.add(canción);
    
            } while (cursor.moveToNext());
    
        }
        else {
            Toast.makeText(this, "Consulta fallida", Toast.LENGTH_SHORT).show();
        }
    }
    

    En este código actualizado, hemos agregado una nueva variable pathColumn para recuperar el índice de la columna DATA, que contiene la ruta del archivo de la canción. Luego, recorremos el cursor usando do-while para recuperar cada canción disponible y crear un objeto Canción con la información necesaria. Finalmente, agregamos la canción a una lista.</canción>

Comments are closed.