Android Canvas: desenho de bitmap muito grande


87

Estou executando o Ubuntu 16.04. E no Android Studio, quando tento executar meu aplicativo no emulador, recebo o seguinte erro:

EXCEÇÃO FATAL: Processo principal: nome do projeto aqui, PID: 2528 java.lang.RuntimeException: Canvas: tentando desenhar um bitmap muito grande (216090000bytes). em android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) em android.graphics.Canvas.drawBitmap (Canvas.java:1415) em android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) no android. widget.ImageView.onDraw (ImageView.java:1316) em android.view.View.draw (View.java:17185) em android.view.View.updateDisplayListIfDirty (View.java:16167) em android.view.View.draw (View.java:16951) em android.view.ViewGroup.drawChild (ViewGroup.java:3727) em android.view.ViewGroup.dispatchDraw (ViewGroup.java:
etc ...

Eu tive que passar por alguns obstáculos para fazer meu emulador funcionar, no entanto, precisei criar um link simbólico para que eu pudesse executar o emulador no AMD. Não tenho certeza se isso é parte do problema. E pela minha vida, não consigo entender por que continua a fazer isso. No meu grupo, há outros que emulam o projeto muito bem no mesmo telefone e SDK emulados.


já tentou ler o bitmap em tamanho menor usando BitmapOption.inSampleSize?
L. Swifter


10
No meu caso, mover o bitmap inicial (de alta resolução) de drawable para drawable-xxhdpi foi a solução. Eu tive o mesmo problema. Não suspeitei que minha tela inicial fosse o problema, pois ela é exibida quando o aplicativo é iniciado, mas descobri que a tela inicial é o problema. A tela inicial no meu caso tem resolução xxhdpi e foi colocada por engano na pasta drawable, em vez de drawable-xxhdpi. Isso fez o Android assumir que a tela inicial tinha resolução mdpi e dimensionar a imagem para 3 * 3 vezes o tamanho necessário e tentar criar um bitmap.
Zubair Rehman

Isso acontece apenas no emulador ou no dispositivo com o mesmo tamanho de tela também?
Dmitry

Respostas:


200

Mova sua imagem no drawable (alta resolução) para drawable-xxhdpi . Mas, no desenvolvimento de aplicativos, você não precisa usar imagens grandes. Isso aumentará o tamanho do arquivo APK.


6
Obrigado, isso também funcionou quando minha imagem era de apenas 500 kb, mas a resolução era muito alta.
ashishdhiman2007

1
Estou recebendo este erro ao carregar imagens de uma API. Qual seria a solução nesse caso?
Rohit Singh

2
Encontrei o mesmo problema no Firebase Crashlytics, mas ele não menciona o arquivo + código de linha exato, então não sei qual é a imagem exata que está causando essa falha. Obviamente, há muitas imagens no meu arquivo res, como posso localizar a problemática
ravid rinek,

15

A solução é mover a imagem de uma drawable/pasta para drawable-xxhdpi/outra, como outros já mencionaram.

Mas é importante entender também por que essa sugestão um tanto estranha realmente ajuda:

O motivo é que a drawable/pasta existe em versões anteriores do Android e é equivalente a drawable-mdpi. Quando uma imagem que está apenas na drawable/pasta é usada no xxhdpidispositivo, a imagem potencialmente já grande é aumentada em um fator de 3, o que pode então fazer com que a área de cobertura da memória da imagem explodir.


2
Isso significa que posso remover o drawable/diretório se tiver o ativo em outros drawable-xdiretórios?
Karl Taylor

14

Eu tive o mesmo problema. Se você tentar fazer upload de uma imagem muito grande em alguns dispositivos de baixa resolução, o aplicativo entrará em colapso. Você pode fazer várias imagens de diferentes tamanhos (hdpi, xxdpi e mais) ou simplesmente usar uma biblioteca externa para carregar imagens que resolvam o problema de forma rápida e eficiente. Eu usei a biblioteca Glide (você pode usar outra biblioteca como a do Picasso).

    panel_IMG_back = (ImageView) findViewById(R.id.panel_IMG_back);
    Glide
            .with(this)
            .load(MyViewUtils.getImage(R.drawable.wallpaper)
            .into(panel_IMG_back);

6

Acontece que o problema era a imagem principal que usávamos em nosso aplicativo na época. O tamanho real da imagem era muito grande, então o comprimimos. Então funcionou perfeitamente, sem perda de qualidade e o aplicativo rodou bem no emulador.


@BekaBot A pergunta original era de um tempo atrás. Mas, se bem me lembro, apenas rodamos nossa imagem por meio de um compressor de imagem online e, em seguida, rodamos novamente nosso aplicativo e ele funcionou bem. Eu espero que isso ajude.
Francisco

3

Eu também tive esse problema quando estava tentando adicionar uma tela inicial ao aplicativo Android por meio do launch_backgrgound.xml. o problema era a resolução. era muito alto, então a área de cobertura da memória das imagens explodiu e fez o aplicativo travar, daí o motivo desse erro. Portanto, basta redimensionar sua imagem usando um site chamado nativescript image builder, então peguei o ldpi, mdpi e todo o resto e funcionou bem para mim.


salve meu dia, mesmo problema.
Abdul Basit Rishi

2

Pois esse erro foi como outros falaram uma imagem grande (1800px X 900px) que estava no diretório drawable, editei a imagem e reduzi o tamanho proporcionalmente usando o photoshop e funcionou ... !!


2

se você usar o Picasso, mude para o Glide assim.

Remover picasso

Picasso.get().load(Uri.parse("url")).into(imageView)

Mudança de deslize

Glide.with(context).load("url").into(imageView)

Glide mais eficiente do que o desenho de Picasso em bitmap grande


3
Eu tenho esse mesmo erro no Glide, carregamento de imagem por URL e tem apenas 2 MB de imagem.
Príncipe Dholakiya

1

Acabei de criar o diretório drawable-xhdpi (você pode alterá-lo de acordo com sua necessidade) e copie e cole todas as imagens para esse diretório.


0

No meu caso, tive que remover a plataforma Android e adicioná-la novamente. Algo travou e copiar todo o meu código em outro aplicativo funcionou perfeitamente - daí minha ideia de limpar a compilação do Android removendo a plataforma.

cordova platform remove android
cordova platform add android

Acho que é algum tipo de limpeza que você precisa fazer de vez em quando :-(


0

Isso pode ser um problema com o Glide. Use-o enquanto tenta carregar muitas imagens e algumas delas são muito grandes:

Glide.load("your image path")
                       .transform(
                               new MultiTransformation<>(
                                       new CenterCrop(),
                                       new RoundedCorners(
                                               holder.imgCompanyLogo.getResources()
                                                       .getDimensionPixelSize(R.dimen._2sdp)
                                       )
                               )
                       )
                       .error(R.drawable.ic_nfs_default)
                       .into(holder.imgCompanyLogo);
           }

0

Essa solução funcionou para mim.

Adicione essas linhas na tag do aplicativo Manifest

android:largeHeap="true"
android:hardwareAccelerated="false"

    

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.