Android Canvas: dibujar un mapa de bits demasiado grande

87

Estoy ejecutando Ubuntu 16.04. Y en Android Studio, cuando intento ejecutar mi aplicación en el emulador, aparece el siguiente error:

EXCEPCIÓN FATAL: proceso principal: nombre del proyecto aquí, PID: 2528 java.lang.RuntimeException: Canvas: intentando dibujar un mapa de bits demasiado grande (216090000bytes). en android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) en android.graphics.Canvas.drawBitmap (Canvas.java:1415) en android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) en android. widget.ImageView.onDraw (ImageView.java:1316) en android.view.View.draw (View.java:17185) en android.view.View.updateDisplayListIfDirty (View.java:16167) en android.view.View.draw (View.java:16951) en android.view.ViewGroup.drawChild (ViewGroup.java:3727) en android.view.ViewGroup.dispatchDraw (ViewGroup.java:
etc ...

Sin embargo, tuve que ejecutar algunos aros para que mi emulador funcionara, pero necesitaba crear un enlace simbólico para poder ejecutar el emulador en AMD. No estoy seguro si esto es parte del problema. Y por mi vida, no puedo entender por qué sigue haciendo esto. En mi grupo hay otros que emulan el proyecto sin problemas en el mismo teléfono emulado y SDK.

Francisco
fuente
¿Ha intentado leer el mapa de bits en un tamaño más pequeño usando BitmapOption.inSampleSize?
L. Swifter
1
muestra tu mapa de bits con este desarrollador.android.com/training/displaying-bitmaps/…
Nishant Verma
10
En mi caso, mover el mapa de bits de bienvenida (en alta resolución) de drawable a drawable-xxhdpi fue la solución. Yo tuve el mismo problema. No sospeché que mi pantalla de bienvenida fuera el problema, ya que se muestra cuando se inicia la aplicación, pero resultó que la pantalla de bienvenida es el problema. La pantalla de inicio en mi caso tiene una resolución xxhdpi y se colocó por error en la carpeta dibujable, en lugar de drawable-xxhdpi. Esto hizo que Android asumiera que la pantalla de presentación tenía una resolución de mdpi y escalar la imagen a 3 * 3 veces su tamaño requerido y tratar de crear un mapa de bits.
Zubair Rehman
¿Ocurre solo en el emulador o también en el dispositivo con el mismo tamaño de pantalla?
Dmitry

Respuestas:

200

Mueva su imagen en el (los alquileres) dibujable a dibujable-xxhdpi . Pero en el desarrollo de aplicaciones, no es necesario utilizar una imagen grande. Aumentará el tamaño de su archivo APK.

Md Imran Choudhury
fuente
6
Gracias, eso también funcionó cuando mi imagen tenía solo 500 kb, pero la resolución era demasiado alta.
ashishdhiman2007
1
Recibo este error al cargar imágenes desde una API. ¿Cuál podría ser una solución en ese caso?
Rohit Singh
2
Me encontré con el mismo problema en Firebase Crashlytics pero no menciona el archivo exacto + código de línea, así que no sé cuál es la imagen exacta que causa este bloqueo. Obviamente, hay muchas imágenes en mi archivo res, ¿cómo puedo ubicar la problemática
Ravid rinek
15

La solución es mover la imagen de drawable/carpeta en drawable-xxhdpi/carpeta, como también han mencionado otros.

Pero también es importante entender por qué esta sugerencia algo extraña en realidad ayuda:

La razón es que la drawable/carpeta existe desde las primeras versiones de Android y es equivalente a drawable-mdpi. Cuando drawable/se usa una imagen que solo está en la carpeta en el xxhdpidispositivo, la imagen que ya es potencialmente grande se escala en un factor de 3, lo que en algunos casos puede hacer que la huella de memoria de la imagen explote.

Nace
fuente
2
¿Significa esto que puedo eliminar el drawable/directorio si tengo el activo en otros drawable-xdirectorios?
Karl Taylor
14

Yo tuve el mismo problema. Si intenta cargar una imagen que es demasiado grande en algunos dispositivos de baja resolución, la aplicación colapsará. Puede hacer varias imágenes de diferentes tamaños (hdpi, xxdpi y más) o simplemente usar una biblioteca externa para cargar imágenes que resuelvan el problema de manera rápida y eficiente. Usé la biblioteca Glide (puedes usar otra biblioteca como Picasso).

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

Resulta que el problema era la imagen principal que usamos en nuestra aplicación en ese momento. El tamaño real de la imagen era demasiado grande, así que lo comprimimos. Luego funcionó de maravilla, sin pérdida de calidad y la aplicación funcionó bien en el emulador.

Francisco
fuente
@BekaBot La pregunta original fue de hace un tiempo. Pero si mal no recuerdo, simplemente ejecutamos nuestra imagen a través de un compresor de imágenes en línea, y luego volvimos a ejecutar nuestra aplicación y luego funcionó bien. Espero que esto ayude.
Francisco
3

También tuve este problema cuando intentaba agregar una pantalla de presentación a la aplicación de Android a través de launch_backgrgound.xml. el problema era la resolución. era demasiado alto, por lo que la huella de memoria de las imágenes explotó y provocó que la aplicación se bloqueara, de ahí el motivo de este error. así que simplemente cambie el tamaño de su imagen usando un sitio llamado generador de imágenes nativescript, así que obtuve el ldpi, mdpi y todo lo demás y funcionó bien para mí.

williamjnrkdd
fuente
salva mi día, mismo problema.
Abdul Basit Rishi
2

Para este error fue como dijeron otros una imagen grande (1800px X 900px) que estaba en el directorio dibujable, edité la imagen y reduje el tamaño proporcionalmente usando photoshop y funcionó ... !!

Ishimwe Aubain Consolateur
fuente
2

si usa Picasso, cambie a Glide así.

Quitar picasso

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

Cambiar planeo

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

Glide más eficiente que el dibujo de Picasso en mapa de bits grande

Deniz
fuente
3
Recibí este mismo error en Glide, la imagen se carga a través de la URL y solo tiene 2 MB de imagen.
Prince Dholakiya
1

Acabo de crear el directorio drawable-xhdpi (puede cambiarlo según sus necesidades) y copiar y pegar todas las imágenes en ese directorio.

Sourabh Chaudhary
fuente
0

En mi caso tuve que quitar la plataforma android y volver a agregarla. Algo se atascó y copiar todo mi código en otra aplicación funcionó a la perfección, de ahí mi idea de limpiar la compilación para Android eliminando la plataforma.

cordova platform remove android
cordova platform add android

Supongo que es una especie de limpieza que tienes que hacer de vez en cuando :-(

pieroxia
fuente
0

Esto puede ser un problema con Glide. Utilice esto mientras intenta cargar muchas imágenes y algunas de ellas son muy 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
fuente
0

Esta solución funcionó para mí.

Agregue estas líneas en su etiqueta de solicitud de manifiesto

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

    
Abdul Basit Rishi
fuente