En mi aplicación, tengo que configurar un ícono grande para una notificación. LargeIcon debe ser un mapa de bits, y mis dibujos son imágenes vectoriales (la nueva característica en Android, vea este enlace ) El problema es que cuando intento decodificar un recurso que es una imagen vectorial, me devuelve un valor nulo.
Aquí está la muestra de código:
if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
Log.d("ISNULL", "NULL");
else
Log.d("ISNULL", "NOT NULL");
En este ejemplo, cuando reemplazo R.drawable.vector_menu_objectifs con una imagen "normal", un png por ejemplo, el resultado no es nulo (obtengo el mapa de bits correcto) ¿Hay algo que me falta?

Respuestas:
Comprobado en API: 17, 21, 23
ACTUALIZAR:
Proyecto gradle:
Módulo gradle:
fuente
AppCompatDrawableManagerestá marcado como@RestrictTo(LIBRARY_GROUP)interno y no debe usarlo (su API puede cambiar sin previo aviso). Usar en suContextCompatlugar.Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object referenceen esta líneaBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);Puedes usar el siguiente método:
que a veces combino con:
fuente
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object referenceen esta líneaBitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);Si estás dispuesto a usar Android KTX para Kotlin, puede usar el método de extensión
Drawable#toBitmap()para lograr el mismo efecto que las otras respuestas:o
Para agregar este y otros métodos de extensión útiles, deberá agregar lo siguiente a su nivel de módulo
build.gradleVer aquí las últimas instrucciones para agregar la dependencia a su proyecto.
Tenga en cuenta que esto funcionará para cualquier subclase de
Drawabley, siDrawablees unBitmapDrawable, será un atajo para usar el subyacenteBitmap.fuente
VectorDrawable.En base a las respuestas anteriores, puede simplificarse así para que coincida con VectorDrawable y BitmapDrawable y para ser compatible con al menos API 15.
Luego debe agregar su archivo gradle:
En pre-Lollipop usará VectorDrawableCompat y en Lollipop usará VectorDrawable.
EDITAR
He editado la condición siguiendo el comentario de @ user3109468
fuente
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable)Felicitaciones a @Alexey
Aquí está la
Kotlinversión que usa extensiones paraContextEjemplo de uso en
Activity:fuente
Probado en API 16 - JellyBean con Vector Drawables
fuente
Use el siguiente código para convertir la imagen con la relación de aspecto correcta (por ejemplo, para el icono de notificación):
fuente
Si tu
vectorimagenintrinsicWidthyintrinsicHeightes pequeño y se intenta mostrar el mapa de bits a una gran vista, a continuación, podrás ver el resultado es la falta de definición.En ese caso, puede proporcionar un nuevo ancho / alto para su mapa de bits para obtener la mejor imagen (o puede aumentar el tamaño del vector en xml, pero proporcionar el
desireWidthydesireHeightpuede ser más flexible).Espero que ayude
fuente
fuente
Si desea poder escalar su salida al tamaño de salida deseado, pruebe el siguiente fragmento:
fuente
Esto le proporciona el mapa de bits en el tamaño que desee. Además, le permite mantener o no la transparencia dependiendo de cada imagen para un mejor rendimiento con aquellos que no la necesitan.
fuente