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:
- Excepción de puntero nulo en ActionBar en FragmentActivity
- Ampliación de ObjectGraph con módulo de sustitución
- Java / Android: convierte una cadena de hora GMT a hora local
- Obtener la URL de descarga para el vídeo de YouTube (Android / Java)
- No se pudo encontrar el método com.google.android.gms.common.GooglePlayServicesUtil
// 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
- Facebook Connect Android - usando stream.publish @ http://api.facebook.com/restserver.php
- Problema al convertir .docx al archivo pdf en android
- Cómo establecer un intervalo de minutos personalizado en TimePickerDialog en Android
- Animación de Fab en clic (zoom in / out)
- Uso del archivo json local en Android
- ¿Por qué funciona este código Java? Compilador no se queja de cierre
- Obtener la hora y la fecha actuales en una escala de tiempo de 24 horas
- Cambiar la fuente del título de la aplicación en android
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.
- Cómo controla la orientación de la pantalla del dispositivo Android
- No se puede instanciar la actividad ComponentInfo no puede instanciar la clase