Spanish [SOLUCIONADO] ERROR CAMARA B4I

Anton Solans Argemí

Active Member
Licensed User
Al hacer una foto me da el siguiente error. Días anteriores me funcionaba correctamente y no he hecho ningún cambio. ¿ A que puede ser debido ?
B4X:
SignalHandler 6
Error occurred on line: 77 (mcamara)
Signal - 6
Stack Trace: (
    "0  Nombre_APP           SignalHandler + 112",
    "1   libsystem_platform.dylib            0x1b3b0251 _sigtramp + 16",
    "2   libsystem_kernel.dylib              0x1b2f9dbb <redacted> + 64",
    "3   libsystem_kernel.dylib              0x1b2f9df5 system_set_sfi_window + 0",
    "4   TCC                  <redacted> + 198",
    "5   TCC                  <redacted> + 0",
    "6   TCC                  <redacted> + 352",
    "7   libxpc.dylib         <redacted> + 46",
    "8   libxpc.dylib         <redacted> + 26",
    "9   libdispatch.dylib    <redacted> + 536"
)

El código que hago servir para hacer la foto es el siguiente:
B4X:
'Code module

Sub Process_Globals
    Private Page_fcamara As Page
    Private btnTakePicture As Button
    Private cam As Camera
    Private VideoPlayer1 As VideoPlayer
    Private ImageView1 As ImageView
    Private bcomplete As Boolean 
End Sub

Sub show
    If Page_fcamara.IsInitialized=False Then
        Page_fcamara.Initialize("Page_fcamara")
        Page_fcamara.RootPanel.LoadLayout("fcamara")
        'Page_fcamara.HideBackButton=True
    End If
    Main.NavControl.ShowPage (Page_fcamara)
    bcomplete=False
    InitCamera
    TakePicture
End Sub

Sub TakePicture
    InitCamera
    cam.TakePicture
End Sub


Sub InitCamera
    cam.Initialize("cam", Page_fcamara)
End Sub

Sub Cam_Complete (Success As Boolean, Image As Bitmap, VideoPath As String)
    Dim p As Phone
    bcomplete=True
    If Success Then
        If Image.IsInitialized Then
            VideoPlayer1.BaseView.Visible = False
            Dim My_bmp As Bitmap
            My_bmp=Image
            modulo.ReturnFoto(My_bmp)
        End If
    End If
End Sub

Sub Page_fcamara_appear
    If bcomplete=True Then
        Main.NavControl.RemoveCurrentPage
    End If
End Sub
 

JordiCP

Expert
Licensed User
Longtime User
No lo he probado, pero hay algunas cosas que cambiaría (ver cambios en el código adjunto). Puede que sean la causa, o no. Pero en todo caso creo que debería ser así
  • Si el crash ocurre la segunda vez pero no la primera que muestras la cámara, es posible que el valor de bcomplete haya quedado a true.--> en este caso estarías mostrando la página, inicializando la cámara sobre esta página, y enseguida se vuelve a esconder. --> a no ser que el valor de bcomplete se toque en algún otro punto, mejor poner bcomplete = False al principio del 'show', antes de invocar la página.
  • Puede ser porque estás pasando un elemento de un layout acabado de cargar a la inicialización de la cámara, y en alguna ocasión no estar disponible todavía (añadimos el Sleep, solo por si acaso)
  • Se está llamando 2 veces al InitCamera: desde el TakePicture y, justo antes, desde el Show. --> eliminamos la segunda.

B4X:
'Code module

Sub Process_Globals
    Private Page_fcamara As Page
    Private btnTakePicture As Button
    Private cam As Camera
    Private VideoPlayer1 As VideoPlayer
    Private ImageView1 As ImageView
    Private bcomplete As Boolean
End Sub

Sub show

    bcomplete = false     '<-- debemos reiniciarlo antes de volver a hacer aparecer page_fcamara. En caso contrario, si vale 'true' la segunda vez puede fallar.
    If Page_fcamara.IsInitialized=False Then
        Page_fcamara.Initialize("Page_fcamara")
        Page_fcamara.RootPanel.LoadLayout("fcamara")
        'Page_fcamara.HideBackButton=True
    End If
    Main.NavControl.ShowPage (Page_fcamara)
    Sleep(50)   '<-- A veces va bien cuando acabamos de cargar un layout y ya queremos utilizar alguno de sus elementos
    'bcomplete=False <-- lo pasamos al inicio.
    'InitCamera   <--- Lo eliminamos. Ya se llama dentro del TakePicture
    TakePicture
End Sub

Sub TakePicture
    InitCamera
    cam.TakePicture
End Sub


Sub InitCamera
    cam.Initialize("cam", Page_fcamara)
End Sub

Sub Cam_Complete (Success As Boolean, Image As Bitmap, VideoPath As String)
    Dim p As Phone
    bcomplete=True
    If Success Then
        If Image.IsInitialized Then
            VideoPlayer1.BaseView.Visible = False
            Dim My_bmp As Bitmap
            My_bmp=Image
            modulo.ReturnFoto(My_bmp)
        End If
    End If
End Sub

Sub Page_fcamara_appear
    If bcomplete=True Then
        Main.NavControl.RemoveCurrentPage
    End If
End Sub

Si el problema persiste, prueba de poner logs en diferentes puntos para intentar acotar la linea donde sucede.
 

Anton Solans Argemí

Active Member
Licensed User
He puesto:

B4X:
#PlistExtra:<key>NSCameraUsageDescription</key><string>Taking a photo and attach to the task.</string>

Y se me ha solucionado el problema.

Muchas gracias.
 

JordiCP

Expert
Licensed User
Longtime User
Claro, esto también era necesario :)
¿Antes te funcionaba sin el permiso?
 
Top