La forma más robusta de obtener la carátula del álbum en Android

Tenga en cuenta que ya he tenido preguntas similares y sus respuestas aquí y en otros sitios web. También tengo una solución que funciona en algunos dispositivos (mi G2X ejecutando CyanogenMod 7.1, HD2 de mi esposa que ejecuta una ROM personalizada y el emulador que ejecuta Android 2.1). No funciona, sin embargo, funciona en mi Nook corriendo CyanogenMod.

Mi pregunta es: ¿Cuál es la forma más robusta y general para obtener la portada del álbum en todos los dispositivos Android? ¿Cuáles son las gotchas para dispositivos específicos, versiones o aplicaciones de música (no me refiero a los jugadores de terceros, me refiero a Google Music contra el viejo cliente de música)? Mi código actual es:

// Is this what's making my code fail on other devices? public final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); // This works, and well on all devices private int[] getAlbumIds(ContentResolver contentResolver) { List<Integer> result = new ArrayList<Integer>(); Cursor cursor = contentResolver.query(MediaStore.Audio.Media.getContentUri("external"), new String[]{MediaStore.Audio.Media.ALBUM_ID}, null, null, null); if (cursor.moveToFirst()) { do{ int albumId = cursor.getInt(0); if (!result.contains(albumId)) result.add(albumId); } while (cursor.moveToNext()); } int[] resultArray = new int[result.size()]; for (int i = 0; i < result.size(); i++) resultArray[i] = result.get(i); return resultArray; } // This is the bit I want to make more robust, make sure that it works on all devices private Shader getAlbumArt(ContentResolver contentResolver, int albumId, int width, int height) { Uri uri = ContentUris.withAppendedId(sArtworkUri, albumId); InputStream input = null; try { input = contentResolver.openInputStream(uri); if (input == null) return null; Bitmap artwork = BitmapFactory.decodeStream(input); input.close(); if (artwork == null) return null; Bitmap scaled = Bitmap.createScaledBitmap(artwork, width, height, true); if (scaled == null) return null; if (scaled != artwork) artwork.recycle(); artwork = scaled; return new BitmapShader(artwork, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); } catch (IOException e) { e.printStackTrace(); return null; } } 

Gracias de antemano, Ananth

Aquí puedo adjuntar una función que es volver álbum de arte de la tienda de medios. Aquí en la función sólo tenemos que pasar el album_id que obtenemos de Media Store.

  public Bitmap getAlbumart(Long album_id) { Bitmap bm = null; try { final Uri sArtworkUri = Uri .parse("content://media/external/audio/albumart"); Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id); ParcelFileDescriptor pfd = context.getContentResolver() .openFileDescriptor(uri, "r"); if (pfd != null) { FileDescriptor fd = pfd.getFileDescriptor(); bm = BitmapFactory.decodeFileDescriptor(fd); } } catch (Exception e) { } return bm; } 
 Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id); ContentResolver res = context.getContentResolver(); InputStream in = res.openInputStream(uri); Bitmap artwork = BitmapFactory.decodeStream(in); 

Se puede encontrar un código de ejemplo más completo en la fuente del reproductor de música Android, aquí https://github.com/android/platform_packages_apps_music/blob/master/src/com/android/music/MusicUtils.java método getArtworkQuick.

Este fragmento de código inferior devuelve el uri para la caché de álbum de arte presente en el MediaStore. tal vez esto ayude.

  Cursor cursorAudio = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, {MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DATA}, MediaStore.Audio.Media.DATA+ " LIKE \"" + path+ "\"", null, null);if(cursorAudio != null && cursorAudio.moveToFirst()){ Long albumId = Long.valueOf(cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))); cursorAudio.close(); Cursor cursorAlbum = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, MediaStore.Audio.Albums._ID+ "=" + albumId, null, null); if(cursorAlbum != null && cursorAlbum.moveToFirst()){ String uri = cursorAlbum.getString(cursorAlbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART)); cursorAlbum.close(); if(uri != null){ return Uri.parse(uri); } } 

Quisiera modificar la respuesta de Chirag Raval usando la biblioteca de Picasso. Es fácil de usar y muy potente.

 final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); Uri uri = ContentUris.withAppendedId(sArtworkUri, arrayList.get(i).getArt()); Picasso.with(context).load(uri).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher) .into(ivPic); 

Para obtener una documentación completa, consulte esto.

  • Necesito ayuda con Android y Java
  • Muchos módulos pequeños, o pocos módulos grandes para el mejor rendimiento de la construcción?
  • Configuración del valor de propiedad Singleton en el Listado de Firebase
  • Buenas prácticas para multi-threading
  • ¿Tiene Glide un método para cargar tanto PNG como SVG?
  • Sqlite - en rebaja
  • IText crear un documento con tamaños de página desiguales
  • java.lang.NullPointer Excepción en getResources (). getString (R.string.value);
  • No se pueden obtener widgets de main.xml referenciados en el programa Java
  • ¿Cuáles son los 37 paquetes de Java API posiblemente gravados por la decisión de Oracle v de mayo de 2014?
  • Error al inflar la clase com.google.ads.AdView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.