No meu aplicativo, tenho que definir um ícone grande para uma notificação. O LargeIcon deve ser um Bitmap e meus desenhos são imagens vetoriais (o novo recurso do Android, veja este link ). O problema é quando tento decodificar um recurso que é uma imagem vetorial e recebo um nulo.
Aqui está o exemplo de código:
if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
Log.d("ISNULL", "NULL");
else
Log.d("ISNULL", "NOT NULL");
Neste exemplo, quando substituo R.drawable.vector_menu_objectifs por uma imagem "normal", um png por exemplo, o resultado não é nulo (recebo o bitmap correto) Há algo que está faltando?
Respostas:
Verificado na API: 17, 21, 23
ATUALIZAR:
Nível do projeto:
Gradle do módulo:
fonte
AppCompatDrawableManager
está marcado como@RestrictTo(LIBRARY_GROUP)
interno, e você não deve usá-lo (sua API pode ser alterada sem aviso prévio). Use emContextCompat
vez disso.Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
nesta linhaBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Você pode usar o seguinte método:
com as quais eu às vezes combino:
fonte
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
nesta linhaBitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Se você deseja usar o Android KTX for Kotlin, pode usar o método de extensão
Drawable#toBitmap()
para obter o mesmo efeito que as outras respostas:ou
Para adicionar esse e outros métodos úteis de extensão, você precisará adicionar o seguinte ao seu módulo
build.gradle
Veja aqui as instruções mais recentes para adicionar a dependência ao seu projeto.
Observe que isso funcionará para qualquer subclasse de
Drawable
e, seDrawable
forBitmapDrawable
, será um atalho para usar o subjacenteBitmap
.fonte
VectorDrawable
.Com base nas respostas anteriores, pode ser simplificado assim para corresponder ao VectorDrawable e ao BitmapDrawable e para ser compatível com pelo menos a API 15.
Então você tem que adicionar no seu arquivo gradle:
No pré-pirulito, ele usará o VectorDrawableCompat e, no pirulito, usará o VectorDrawable.
EDITAR
Editei a condição após o comentário de @ user3109468
fonte
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable)
Muitos elogios para @Alexey
Aqui está a
Kotlin
versão usando extensões paraContext
Exemplo de uso em
Activity
:fonte
Testado na API 16 - JellyBean com gavetas vetoriais
fonte
Use o código a seguir para converter a imagem com a proporção correta (por exemplo, para o ícone de notificação):
fonte
Se a sua
vector
imagemintrinsicWidth
eintrinsicHeight
é pequeno e você tenta exibir o bitmap para um grande ponto de vista, então você vai ver o resultado é borrão.Nesse caso, você pode fornecer uma nova largura / altura para o seu bitmap para obter a melhor imagem (ou aumentar o tamanho do vetor em xml, mas forneça
desireWidth
edesireHeight
possa ser mais flexível).Espero que ajude
fonte
fonte
Se você deseja dimensionar sua saída para o tamanho de saída desejado, tente o seguinte trecho:
fonte
Isso fornece o bitmap no tamanho desejado. Além disso, permite manter ou não a transparência, dependendo de cada imagem, para obter melhor desempenho com aqueles que não precisam dela.
fonte