¿Cómo utilizar la consulta MediaStore para obtener los artistas sin duplicados?
Me gustaría obtener todos los nombres de los artistas en mi teléfono usando MediaStore , Ya tengo toda la lista, pero con duplicados de todas las entradas debido a múltiples canciones de enlaces / artistas. ¿Hay alguna manera de utilizar la consulta para obtener sólo uno de cada uno, sin duplicados?
Hay mi consulta:
- ¿Qué hace MediaStore.Images.Media.MINI_THUMB_MAGIC?
- Android - Selector de imágenes no funciona en Kindle Fire?
- No puede solicitar permiso READ_EXTERNAL_STORAGE
- Android MediaStore sqlite db ubicación
- Reproducir canción en el reproductor de música predeterminado - android
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; String[] projection = { MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DURATION }; Cursor cursor = context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null);
Gracias por adelantado !
- La columna MediaStore.MediaColumns.TITLE de MediaStore de Android es nula para algunos archivos
- ¿Cuál es la diferencia entre el título y el nombre para mostrar
- Cómo actualizar MediaStore de Android al eliminar fotos
- Android Eclipse Consultar miniaturas de imágenes almacenadas fuera de la galería
- Obtener nombre de archivo y ruta de URI de mediastore
- Obtener todas las fotos de la programación android de dispositivos Android
- ¿Cómo funciona CursorAdapter en android en GridView?
- Archivos no eliminados al borrar y aún mostrados en Listview
El uso de la palabra clave DISTINCT en la consulta devuelve valores no duplicados. Por ejemplo, listar sólo nombres de álbumes al consultar muchos números de audio
new String[] { "DISTINCT " + MediaStore.Audio.Playlists.Members.ALBUM_ID + " as _id"}
pero he encontrado que sólo se puede devolver una columna
Lo mantuve simple y hizo lo siguiente al realizar bucle a través del cursor. Pase el valor, en su caso el artista,
if (value.length() > 0) { // check if value already exists if (!listItems.contains(value)) { // doesn't exist, add it listItems.add(value); } }
Este es un método simple. Puedes consultar esto en mi Administrador de listas de reproducción de aplicaciones en Google Play. Utilizo esta técnica para seleccionar artistas, años, etc.
Para las personas que todavía están buscando una respuesta a esto, sugeriría hacer lo siguiente:
String[] mProjection = { MediaStore.Audio.Artists._ID, MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists.NUMBER_OF_TRACKS, MediaStore.Audio.Artists.NUMBER_OF_ALBUMS }; Cursor artistCursor = mContentResolver.query( MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, mProjection, null, null, MediaStore.Audio.Artists.ARTIST + " ASC");
Ahora puede consultar este cursor para obtener el nombre de todos los artistas. No habrá duplicados.
Entiendo que esta no es la solución para " obtener valores únicos de MediaStore " en general. Pero resolvería este problema muy específico.
Explicación :
Sólo tienes que consultar la tabla derecha, que en este caso fue la tabla " Artist
", mientras que la op estaba consultando la tabla " Media
".
Espero que esto ayude a alguien.
Bueno, para evitar ese problema, he utilizado la palabra clave "UNIQUE" cuando creo mis tablas.
public ArrayList getAlbumList () {
ArrayList<SongBeen> albumList=new ArrayList<SongBeen>(); ContentResolver musicResolver = activity.getContentResolver(); Uri musicUri = android.provider.MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI; Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); if(musicCursor!=null && musicCursor.moveToFirst()){ int titleColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media._ID); int artistColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ARTIST); int albumColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ALBUM); //add songs to list do { SongBeen been=new SongBeen(); been.setId(musicCursor.getLong(idColumn)); been.setAlbum(musicCursor.getString(albumColumn)); been.setArtist(musicCursor.getString(artistColumn)); albumList.add(been); } while (musicCursor.moveToNext()); } return albumList; }
- Android TableLayout con el ancho de la columna diferente en una fila
- ¿Cómo puedo establecer un ancho máximo en un LinearLayout para que no se estire en modo horizontal?