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
AppCompatDrawableManager
está marcado como@RestrictTo(LIBRARY_GROUP)
interno y no debe usarlo (su API puede cambiar sin previo aviso). Usar en suContextCompat
lugar.Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
en 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 reference
en 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.gradle
Ver aquí las últimas instrucciones para agregar la dependencia a su proyecto.
Tenga en cuenta que esto funcionará para cualquier subclase de
Drawable
y, siDrawable
es 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
Kotlin
versión que usa extensiones paraContext
Ejemplo 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
vector
imagenintrinsicWidth
yintrinsicHeight
es 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
desireWidth
ydesireHeight
puede 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