Spanish [SOLUCIONADO] Error java.lang.RuntimeException: Canvas: trying to draw too large(432000000bytes) bitmap.

Anton Solans Argemí

Active Member
Licensed User
Longtime User
Hola a todos,

Para hacer fotos en mi APP utilizo el CameraEX.

Lo tengo en varios dispositivos de distintas marcas y nunca me ha dado problema y funciona todo perfectamente.

Ahora la he instalado en un móbil nuevo Redmi Note 11 Pro+5G y me da el siguiente error
(lo tengo instalado en otro modelo Redmi, el Mi 10T y funciona perfectamente) :

B4X:
java.lang.RuntimeException: Canvas: trying to draw too large(432000000bytes) bitmap.

at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:280)

at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:88)

at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:548)

at android.view.View.getDrawableRenderNode(View.java:23206)

at android.view.View.drawBackground(View.java:23080)

at android.view.View.draw(View.java:22811)

at android.view.View.updateDisplayListIfDirty(View.java:21646)

at android.view.View.draw(View.java:22534)

at android.view.ViewGroup.drawChild(ViewGroup.java:4606)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4365)

at android.view.View.draw(View.java:22834)

at android.view.View.updateDisplayListIfDirty(View.java:21646)

at android.view.View.draw(View.java:22534)

at android.view.ViewGroup.drawChild(ViewGroup.java:4606)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4365)

at android.view.View.updateDisplayListIfDirty(View.java:21637)

at android.view.View.draw(View.java:22534)

at android.view.ViewGroup.drawChild(ViewGroup.java:4606)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4365)

at android.view.View.updateDisplayListIfDirty(View.java:21637)

at android.view.View.draw(View.java:22534)

at android.view.ViewGroup.drawChild(ViewGroup.java:4606)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4365)

at android.view.View.draw(View.java:22834)

at com.android.internal.policy.DecorView.draw(DecorView.java:826)

at android.view.View.updateDisplayListIfDirty(View.java:21646)

at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559)

at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:567)

at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:651)

at android.view.ViewRootImpl.draw(ViewRootImpl.java:4415)

at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4116)

at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3365)

at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2149)

at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8754)

at android.view.Choreographer$CallbackRecord.run(Choreographer.java:995)

at android.view.Choreographer.doCallbacks(Choreographer.java:817)

at android.view.Choreographer.doFrame(Choreographer.java:748)

at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:980)

at android.os.Handler.handleCallback(Handler.java:938)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loop(Looper.java:236)

at android.app.ActivityThread.main(ActivityThread.java:8087)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
 

josejad

Expert
Licensed User
Longtime User
Hola:

Si tienes acceso al móvil, instala B4A-Bridge e intenta reproducir el error en modo debug, a ver en qué línea de código aparece.
Parece claro que hay alguna imagen por ahí que Canvas no puede dibujar por ser muy grande, pero al menos saber si es al mostrar la imagen en un panel, al grabar un video, una imagen o algo... y acotar un poco más el error para poder ver qué pasa o poder buscar más pistas por el foro.

saludos,
 

Anton Solans Argemí

Active Member
Licensed User
Longtime User
Hola José,

Justo esta mañana he podido disponer de él y el mensaje que he adjuntado es justo el error que me da al hacer el Debug con el B4A-Bridge que he instalado previamente.
Ya me ha parecido raro no ver ninguna línea.
La cámara se me abre correctamente.
El error me da justo cuando le doy al botón para hacer la foto.
En los móviles que me funciona correctamente cuando pulso el botón para hacer la foto, me aparece la foto con la posibilidad de 'Cancelar','Reintentar' o 'Aceptar' y en este teléfono que no me funciona al pulsar el botón de la foto es cuando se me sale de la APP y me da este error en modo Debug.
 

josejad

Expert
Licensed User
Longtime User
Supongo que hablas de este ejemplo. Creo recordar que cuando haces la foto, esta se muestra en un panel como una vista previa o algo así y supongo que será ahí el error,

Puedes poner un log en alguno de estos puntos para ver si es al hacer la foto, o al guardarla, pero creo que deberías hacer un pequeño ejemplo o probar el original y exponerlo en el foro en inglés a ver si alguien te puede dar la respuesta. Prueba también a cambiar la resolución de las fotos, a ver cuándo deja de dar el error, para dar más información también.

Supongo que tienes la última versión de la librería Camera (2.20)

B4X:
Sub btnTakePicture_Click
    Log(Antes TakePicture) '<----- Pon algunos de prueba aquí y en la clase CameraExClass  en la sub TakePicture
    camEx.TakePicture
    Log(Después TakePicture) '<-----
End Sub

Sub Camera1_PictureTaken (Data() As Byte)
    Dim filename As String = "1.jpg"
    Dim dir As String = File.DirInternal
    Log(Antes SavePictureToFile ) '<-----
    camEx.SavePictureToFile(Data, dir, filename)
    Log(Después SavePictureToFile ) '<-----
    camEx.StartPreview 'restart preview
    ToastMessageShow("Picture saved." & CRLF  & "File size: " & File.Size(dir, filename), True)
End Sub
 

Anton Solans Argemí

Active Member
Licensed User
Longtime User
Supongo que hablas de este ejemplo. Creo recordar que cuando haces la foto, esta se muestra en un panel como una vista previa o algo así y supongo que será ahí el error,
Si, hablo de este ejemplo

Puedes poner un log en alguno de estos puntos para ver si es al hacer la foto, o al guardarla, pero creo que deberías hacer un pequeño ejemplo o probar el original y exponerlo en el foro en inglés a ver si alguien te puede dar la respuesta. Prueba también a cambiar la resolución de las fotos, a ver cuándo deja de dar el error, para dar más información también.
Pruebo de hacer esto que comentas

Supongo que tienes la última versión de la librería Camera (2.20)
Lo he revisado tengo la versión 1.30.
Antes de hacer lo de los Logs pondré la 2.20 a ver si con eso se soluciona el problema

Hago todas estas pruebas y ya informo de como ha ido.
Muchas gracias.
 

josejad

Expert
Licensed User
Longtime User
Actualiza a la última versión de B4A también si aún no lo has hecho…
 

Anton Solans Argemí

Active Member
Licensed User
Longtime User
Ya he actualizado a la última versión.

He puesto estos mensajes, y me aparecen el mensaje1/2/3 el 4 ya no:

B4X:
Public Sub TakePicture
    Msgbox("mensaje1","mensaje1")
    cam.TakePicture
    Msgbox("mensaje2","mensaje2")
End Sub

Private Sub Camera_PictureTaken (Data() As Byte)
    Msgbox("mensaje3","mensaje3")    
    CallSub2(target, event & "_PictureTaken", Data)
    Msgbox("mensaje4","mensaje4")   
End Sub
 

josejad

Expert
Licensed User
Longtime User
Ok, entonces el problema debe estar en esta sub, que es la que llama "de vuelta" la línea 9 del código que has puesto.
Pon ahí algunos logs, puede ser que el error esté al guardar la imagen.
Prueba a cambiar File.Dirinternal por XUI.DefaultFolder

B4X:
Sub Camera1_PictureTaken (Data() As Byte)
    Dim filename As String = "1.jpg"
    Dim dir As String = File.DirInternal
    
    camEx.SavePictureToFile(Data, dir, filename)
    camEx.StartPreview 'restart preview
    ToastMessageShow("Picture saved." & CRLF  & "File size: " & File.Size(dir, filename), True)
End Sub

saludos,
 

Anton Solans Argemí

Active Member
Licensed User
Longtime User
Te envío código de lo que hago en el Camera1_PictureTaken:

Al hacer la foto la muestro dando la opción de 'Aceptar','Cancelar' o 'Reintentar' y si la 'Aceptan' entonces es cuando grabo la imagen.
Ya no llego a ver ni el Preview de la foto ni las labels de si quiero 'Aceptar','Cancelar'o 'Reintentar'. Al darle al botón de hacer la foto peta.

B4X:
Sub Camera1_PictureTaken (Data() As Byte)
    ImageView1.Visible=False
    ImageView2.Visible=False
    Label1.Visible=True
    Label2.Visible=True
    label3.Visible=True
    ImageView3.Visible=True
    ImageView3.Bitmap=BytesToImage(Data)
    bdata=Data
    camEx.StopPreview
End Sub
 

josejad

Expert
Licensed User
Longtime User
Bueno, parece que nos vamos acercando (es el problema de ir a ciegas, si no pones tu código o subes algún ejemplo que reproduzca el error, hay que ir adivinando).

Lo mismo, deberías poner algunos logs, para ver dónde está el problema, pero según indica Erel en este hilo trabajar con imágenes grandes (tu cámara tendrá mucha resolución) es problemático. Deberías guardarla primero y después cargarla, mejor que en una ImageView en una B4XImageView, así puedes ajustarla, etc...

saludos,
 

Anton Solans Argemí

Active Member
Licensed User
Longtime User
Para comprobar que el problema sea la carga de la foto en el ImageView a causa de la resolución de la cámara, he sacado la opción de previsualizar la foto donde doy las opciones de poder 'Cancelar', 'Reintentar' o 'Aceptar' y lo que hago ahora es grabar directamente la foto (tal como me indicabas diciendo 'Deberías guardarla primero...') y me ha funcionado correctamente. Problema localizado.
Muchas gracias por la ayuda.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…