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.

Francisco
fonte
já tentou ler o bitmap em tamanho menor usando BitmapOption.inSampleSize?
L. Swifter
1
teste seu bitmap usando este developer.android.com/training/displaying-bitmaps/…
Nishant Verma
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.

Md Imran Choudhury
fonte
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.

Nace
fonte
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);
Guy4444
fonte
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.

Francisco
fonte
@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.

williamjnrkdd
fonte
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 ... !!

Ishimwe Aubain Consolateur
fonte
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

Deniz
fonte
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.

Sourabh Chaudhary
fonte
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 :-(

pieroxy
fonte
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);
           }
Deepak Rajput
fonte
0

Essa solução funcionou para mim.

Adicione essas linhas na tag do aplicativo Manifest

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

    
Abdul Basit Rishi
fonte