Android Question CameraExClass

Alex_197

Well-Known Member
Licensed User
Longtime User
B4X:
'Class module
'version 1.30
'See this page for the list of constants:
'http://developer.android.com/intl/fr/reference/android/hardware/Camera.Parameters.html
'Note that you should use the constant values instead of the names.
Sub Class_Globals
    Private nativeCam As Object
    Private cam As Camera
    Private r As Reflector
    Private target As Object
    Private event As String
    Public Front As Boolean
    Type CameraInfoAndId (CameraInfo As Object, Id As Int)
    Type CameraSize (Width As Int, Height As Int)
    Private parameters As Object
End Sub

Public Sub Initialize (Panel1 As Panel, FrontCamera As Boolean, TargetModule As Object, EventName As String)
    
    Try
    
        target = TargetModule
        event = EventName
        Front = FrontCamera
        Dim id As Int
        id = FindCamera(Front).id
        If id = -1 Then
            Front = Not(Front) 'try different camera
            id = FindCamera(Front).id
            If id = -1 Then
                ToastMessageShow("No camera found.", True)
                Return
            End If
        End If
        cam.Initialize2(Panel1, "camera", id)
    
    Catch
        Log("Initialize " & LastException.Message)
        modFun.ShowError("CameraExClass_Initialize " & LastException.Message)
    End Try
    
End Sub

Private Sub FindCamera (frontCamera As Boolean) As CameraInfoAndId
    
    Try
        

    
        Dim ci As CameraInfoAndId
        Dim cameraInfo As Object
        Dim cameraValue As Int
        'Log("findCamera")
        If frontCamera Then cameraValue = 1 Else cameraValue = 0
        cameraInfo = r.CreateObject("android.hardware.Camera$CameraInfo")
        Dim numberOfCameras As Int = r.RunStaticMethod("android.hardware.Camera", "getNumberOfCameras", Null, Null)
        'Log(r.target)
        'Log(numberOfCameras)
        For i = 0 To numberOfCameras - 1
            r.RunStaticMethod("android.hardware.Camera", "getCameraInfo", Array As Object(i, cameraInfo), _
            Array As String("java.lang.int", "android.hardware.Camera$CameraInfo"))
            r.target = cameraInfo
            'Log("facing: " & r.GetField("facing") & ", " & cameraValue)
'        If r.GetField("facing") = cameraValue Then
'            ci.cameraInfo = r.target
'            ci.Id = i
'            Return ci
'        End If
        
            If cameraValue=r.GetField("facing") Then
                ci.cameraInfo = r.target
                ci.Id = i
                Return ci
            End If
        
        
        Next
        ci.id = -1
        Return ci
    
    Catch
        Log("FindCamera " & LastException.Message)
        modFun.ShowError("CameraExClass_FindCamera " & LastException.Message)
        Return Null
    End Try
    
End Sub

Private Sub SetDisplayOrientation
    
    Try
        
        r.target = r.GetActivity
        r.target = r.RunMethod("getWindowManager")
        r.target = r.RunMethod("getDefaultDisplay")
        r.target = r.RunMethod("getRotation")
        Dim previewResult, result, degrees As Int = r.target * 90
        Dim ci As CameraInfoAndId = FindCamera(Front)
        r.target = ci.CameraInfo
        Dim orientation As Int = r.GetField("orientation")
        If Front Then
            previewResult = (orientation + degrees) Mod 360
            result = previewResult
            previewResult = (360 - previewResult) Mod 360
        Else
            previewResult = (orientation - degrees + 360) Mod 360
            result = previewResult
            'Log(previewResult)
        End If
        r.target = nativeCam
        r.RunMethod2("setDisplayOrientation", previewResult, "java.lang.int")
        r.target = parameters
        r.RunMethod2("setRotation", result, "java.lang.int")
        CommitParameters
    
    Catch
        Log("SetDisplayOrientation " & LastException.Message)
        modFun.ShowError("CameraExClass_SetDisplayOrientation " & LastException.Message)
    End Try
    
End Sub

Private Sub Camera_Ready (Success As Boolean)
    Try
        
        If Success Then
            r.target = cam
            nativeCam = r.GetField("camera")
            r.target = nativeCam
            parameters = r.RunMethod("getParameters")
            SetDisplayOrientation
        Else
            Log("success = false, " & LastException)
        End If
        CallSub2(target, event & "_ready", Success)
    Catch
        Log("Camera_Ready " & LastException.Message)
        modFun.ShowError("CameraExClass_Camera_Ready " & LastException.Message)
    End Try
End Sub
'Uncomment this sub if you need to handle the Preview event
'Sub Camera_Preview (Data() As Byte)
'    If SubExists(target, event & "_preview") Then
'        CallSub2(target, event & "_preview", Data)
'    End If
'End Sub

Public Sub TakePicture
    
    Try
        cam.TakePicture
    Catch
        Log("TakePicture " & LastException.Message)
        modFun.ShowError("CameraExClass_TakePicture " & LastException.Message)
    End Try
        
End Sub

Private Sub Camera_PictureTaken (Data() As Byte)
    Try
        CallSub2(target, event & "_PictureTaken", Data)
    Catch
        Log("Camera_PictureTaken " & LastException.Message)
        modFun.ShowError("CameraExClass_Camera_PictureTaken " & LastException.Message)
    End Try   
End Sub

Public Sub StartPreview
    Try
        cam.StartPreview
    Catch
        Log("StartPreview " & LastException.Message)
        modFun.ShowError("CameraExClass_StartPreview " & LastException.Message)
    End Try
    
End Sub

Public Sub StopPreview
    Try
        cam.StopPreview
    Catch
        Log("StopPreview " & LastException.Message)
        modFun.ShowError("CameraExClass_StopPreview " & LastException.Message)
    End Try
    
End Sub

Public Sub Release
    Try
        cam.Release
    Catch
        Log("Release " & LastException.Message)
        modFun.ShowError("CameraExClass_Release " & LastException.Message)
    End Try   
End Sub

'Saves the data received from PictureTaken event
Public Sub SavePictureToFile(Data() As Byte, Dir As String, FileName As String)
    Try   
    
        Dim out As OutputStream = File.OpenOutput(Dir, FileName, False)
        out.WriteBytes(Data, 0, Data.Length)
        out.Close
    Catch
        Log("SavePictureToFile " & LastException.Message)
        modFun.ShowError("CameraExClass_SavePictureToFile " & LastException.Message)
    End Try
End Sub

Public Sub SetParameter(Key As String, Value As String)
    Try
        r.target = parameters
        r.RunMethod3("set", Key, "java.lang.String", Value, "java.lang.String")
    Catch
        Log("SetParameter " & LastException.Message)
        modFun.ShowError("CameraExClass_SetParameter " & LastException.Message)
    End Try
End Sub

Public Sub GetParameter(Key As String) As String
    
    Try
        r.target = parameters
        Return r.RunMethod2("get", Key, "java.lang.String")
    Catch
        Log("GetParameter " & LastException.Message)
        modFun.ShowError("CameraExClass_GetParameter " & LastException.Message)
        Return ""
    End Try
        
End Sub

Public Sub CommitParameters
    Try
        r.target = nativeCam
        r.RunMethod4("setParameters", Array As Object(parameters), Array As String("android.hardware.Camera$Parameters"))
    Catch
        Log("CommitParameters " & LastException.Message)
        modFun.ShowError("CameraExClass_CommitParameters " & LastException.Message)
        Log(LastException)
    End Try
End Sub

Public Sub GetColorEffect As String
    Try
        Return GetParameter("effect")
    Catch
        Log("GetColorEffect " & LastException.Message)
        modFun.ShowError("CameraExClass_GetColorEffect " & LastException.Message)
        Return ""
    End Try
    
End Sub

Public Sub SetColorEffect(Effect As String)
    Try
        SetParameter("effect", Effect)
    Catch
        Log("SetColorEffect " & LastException.Message)
        modFun.ShowError("CameraExClass_SetColorEffect " & LastException.Message)
    End Try
    
End Sub

Public Sub GetSupportedPreviewSizes As CameraSize()
    
    Try
        
        r.target = parameters
        Dim list1 As List = r.RunMethod("getSupportedPreviewSizes")
        Dim cs(list1.Size) As CameraSize
        For i = 0 To list1.Size - 1
            r.target = list1.get(i)
            cs(i).Width = r.GetField("width")
            cs(i).Height = r.GetField("height")
        Next
        Return cs
    
    Catch
        Log("GetSupportedPreviewSizes " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedPreviewSizes " & LastException.Message)
        Return Null
    End Try
    
End Sub

Public Sub SetPreviewSize(Width As Int, Height As Int)
    
    Try
        r.target = parameters
        r.RunMethod3("setPreviewSize", Width, "java.lang.int", Height, "java.lang.int")
    Catch
        Log("SetPreviewSize " & LastException.Message)
        modFun.ShowError("CameraExClass_SetPreviewSize " & LastException.Message)
    End Try
        
End Sub

Public Sub GetSupportedPicturesSizes As CameraSize()
    Try
            
        r.target = parameters
        Dim list1 As List = r.RunMethod("getSupportedPictureSizes")
        Dim cs(list1.Size) As CameraSize
        For i = 0 To list1.Size - 1
            r.target = list1.get(i)
            cs(i).Width = r.GetField("width")
            cs(i).Height = r.GetField("height")
        Next
        Return cs
    
    Catch
        Log("GetSupportedPicturesSizes " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedPicturesSizes " & LastException.Message)
        Return Null
    End Try
    
End Sub

Public Sub SetPictureSize(Width As Int, Height As Int)
    Try
        r.target = parameters
        r.RunMethod3("setPictureSize", Width, "java.lang.int", Height, "java.lang.int")
    Catch
        Log("SetPictureSize " & LastException.Message)
        modFun.ShowError("CameraExClass_SetPictureSize " & LastException.Message)
    End Try
    
End Sub

Public Sub SetJpegQuality(Quality As Int)
    
    Try
        r.target = parameters
        r.RunMethod2("setJpegQuality", Quality, "java.lang.int")
    Catch
        Log("SetJpegQuality " & LastException.Message)
        modFun.ShowError("CameraExClass_SetJpegQuality " & LastException.Message)
    End Try
    
    
End Sub

Public Sub SetFlashMode(Mode As String)
    
    Try
        r.target = parameters
        r.RunMethod2("setFlashMode", Mode, "java.lang.String")
    Catch
        Log("SetFlashMode " & LastException.Message)
        modFun.ShowError("CameraExClass_SetFlashMode " & LastException.Message)
    End Try
    
    
End Sub

Public Sub GetFlashMode As String
    
    Try
        r.target = parameters
        Return r.RunMethod("getFlashMode")
    Catch
        Log("GetFlashMode " & LastException.Message)
        modFun.ShowError("CameraExClass_GetFlashMode " & LastException.Message)
        Return ""
    End Try
        
End Sub

Public Sub GetSupportedFlashModes As List
    
    Try
        r.target = parameters
        Return r.RunMethod("getSupportedFlashModes")
    Catch
        Log("GetSupportedFlashModes " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedFlashModes " & LastException.Message)
        Return Null
    End Try
        
End Sub

Public Sub GetSupportedColorEffects As List
    Try
        r.target = parameters
        Return r.RunMethod("getSupportedColorEffects")
    Catch
        Log("GetSupportedColorEffects " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedColorEffects " & LastException.Message)
        Return Null
    End Try
    
End Sub

'Returns a list with the supported preview fps. Each item in the list is an array of two ints (minimum value and maximum value).
Public Sub GetSupportedPreviewFpsRange As List
    
    Try
        r.target = parameters
        Return r.RunMethod("getSupportedPreviewFpsRange")
    Catch
        Log("GetSupportedPreviewFpsRange " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedPreviewFpsRange " & LastException.Message)
        Return Null
    End Try
    
    
End Sub
'Returns the current preview fps range.
'Range is a two elements array. The minimum value and maximum value will be stored in this array.
Public Sub GetPreviewFpsRange(Range() As Int)
    Try
        r.target = parameters
        r.RunMethod4("getPreviewFpsRange", Array As Object(Range), Array As String("[I"))
    Catch
        Log("GetPreviewFpsRange " & LastException.Message)
        modFun.ShowError("CameraExClass_GetPreviewFpsRange " & LastException.Message)
    End Try
    
End Sub

Public Sub SetPreviewFpsRange(MinValue As Int, MaxValue As Int)
    Try
        r.target = parameters
        r.RunMethod4("setPreviewFpsRange", Array As Object(MinValue, MaxValue), _
        Array As String("java.lang.int", "java.lang.int"))
    Catch
        Log("SetPreviewFpsRange " & LastException.Message)
        modFun.ShowError("CameraExClass_SetPreviewFpsRange " & LastException.Message)
    End Try
End Sub

Public Sub GetPreviewSize As CameraSize
    Try
        r.target = parameters
        r.target = r.RunMethod("getPreviewSize")
        Dim cs As CameraSize
        cs.Width = r.GetField("width")
        cs.Height = r.GetField("height")
        Return cs
    Catch
        Log("GetPreviewSize " & LastException.Message)
        modFun.ShowError("CameraExClass_GetPreviewSize " & LastException.Message)
        Return Null
    End Try
    
End Sub

Public Sub GetPictureSize As CameraSize
    Try
            
        r.target = parameters
        r.target = r.RunMethod("getPictureSize")
        Dim cs As CameraSize
        cs.Width = r.GetField("width")
        cs.Height = r.GetField("height")
        Return cs
    
    Catch
        Log("GetPictureSize " & LastException.Message)
        modFun.ShowError("CameraExClass_GetPictureSize " & LastException.Message)
        Return Null
    End Try
    
End Sub

'Converts a preview image formatted in YUV format to JPEG.
'Note that you should not save every preview image as it will slow down the whole process.
Public Sub PreviewImageToJpeg(data() As Byte, quality As Int) As Byte()
    Try
            
        Dim size, previewFormat As Object
        r.target = parameters
        size = r.RunMethod("getPreviewSize")
        previewFormat = r.RunMethod("getPreviewFormat")
        r.target = size
        Dim width = r.GetField("width"), height = r.GetField("height") As Int
        Dim yuvImage As Object = r.CreateObject2("android.graphics.YuvImage", _
        Array As Object(data, previewFormat, width, height, Null), _
        Array As String("[B", "java.lang.int", "java.lang.int", "java.lang.int", "[I"))
        r.target = yuvImage
        Dim rect1 As Rect
        rect1.Initialize(0, 0, r.RunMethod("getWidth"), r.RunMethod("getHeight"))
        Dim out As OutputStream
        out.InitializeToBytesArray(100)
        r.RunMethod4("compressToJpeg", Array As Object(rect1, quality, out), _
        Array As String("android.graphics.Rect", "java.lang.int", "java.io.OutputStream"))
        Return out.ToBytesArray
    Catch
        Log("PreviewImageToJpeg " & LastException.Message)
        modFun.ShowError("CameraExClass_PreviewImageToJpeg " & LastException.Message)
        Return Null
    End Try
End Sub

Public Sub GetSupportedFocusModes As List
    
    Try
        
        r.target = parameters
        Return r.RunMethod("getSupportedFocusModes")
    Catch
        Log("GetSupportedFocusModes " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedFocusModes " & LastException.Message)
        Return Null
    End Try
End Sub

Public Sub SetContinuousAutoFocus
    
    Try
        
        Dim modes As List = GetSupportedFocusModes
        If modes.IndexOf("continuous-picture") > -1 Then
            SetFocusMode("continuous-picture")
        Else If modes.IndexOf("continuous-video") > -1 Then
            SetFocusMode("continuous-video")
        Else
            Log("Continuous focus mode is not available")
        End If
    Catch
        Log("SetContinuousAutoFocus " & LastException.Message)
        modFun.ShowError("CameraExClass_SetContinuousAutoFocus " & LastException.Message)
    End Try
End Sub

Public Sub SetFocusMode(Mode As String)
    
    Try
        r.target = parameters
        r.RunMethod2("setFocusMode", Mode, "java.lang.String")
    Catch
        Log("SetFocusMode " & LastException.Message)
        modFun.ShowError("CameraExClass_SetFocusMode " & LastException.Message)
    End Try
        
End Sub

Public Sub GetFocusDistances As Float()
    Try
            
        Dim F(3) As Float
        r.target = parameters
        r.RunMethod4("getFocusDistances", Array As Object(F), Array As String("[F"))
        Return F
    Catch
        Log("GetFocusDistances " & LastException.Message)
        modFun.ShowError("CameraExClass_GetFocusDistances " & LastException.Message)
        Return Null
    End Try
End Sub

Public Sub GetSupportedPictureFormats As List
    
    Try
        
        r.target = parameters
        Return r.RunMethod("getSupportedPictureFormats")
    Catch
        Log("GetSupportedPictureFormats " & LastException.Message)
        modFun.ShowError("CameraExClass_GetSupportedPictureFormats " & LastException.Message)
        Return Null
    End Try
End Sub

'This method should only be called if you need to immediately release the camera.
'For example if you need to start another application that depends on the camera.
Public Sub CloseNow
    Try
        cam.Release
        r.target = cam
        r.RunMethod2("releaseCameras", True, "java.lang.boolean")
    Catch
        Log("CloseNow " & LastException.Message)
        modFun.ShowError("CameraExClass_CloseNow " & LastException.Message)
    End Try
    
End Sub

'Calls AutoFocus and then takes the picture if focus was successfull.
Public Sub FocusAndTakePicture
    Try
        cam.AutoFocus
    Catch
        Log("FocusAndTakePicture " & LastException.Message)
        modFun.ShowError("CameraExClass_FocusAndTakePicture " & LastException.Message)
    End Try
    
End Sub


Private Sub Camera_FocusDone (Success As Boolean)
    
    Try
        If Success Then
            TakePicture
        Else
            Log("AutoFocus error.")
        End If
    Catch
        Log("Camera_FocusDone " & LastException.Message)
        modFun.ShowError("CameraExClass_Camera_FocusDone " & LastException.Message)
    End Try
        
End Sub

Public Sub IsZoomSupported As Boolean
    
    Try
        r.target = parameters
        Return r.RunMethod("isZoomSupported")
    Catch
        Log("IsZoomSupported " & LastException.Message)
        modFun.ShowError("CameraExClass_IsZoomSupported " & LastException.Message)
        Return False
    End Try
    
End Sub

Public Sub GetMaxZoom As Int
    
    Try
        r.target = parameters
        Return r.RunMethod("getMaxZoom")
    Catch
        Log("GetMaxZoom " & LastException.Message)
        modFun.ShowError("CameraExClass_GetMaxZoom " & LastException.Message)
        Return 0
    End Try
      
End Sub

Public Sub getZoom() As Int
    Try
        r.target = parameters
        Return r.RunMethod("getZoom")
    Catch
        Log("getZoom " & LastException.Message)
        modFun.ShowError("CameraExClass_getZoom " & LastException.Message)
        Return 0
    End Try
    
End Sub

Public Sub setZoom(ZoomValue As Int)
    
    Try
        r.target = parameters
        r.RunMethod2("setZoom", ZoomValue, "java.lang.int")
    Catch
        Log("setZoom " & LastException.Message)
        modFun.ShowError("CameraExClass_setZoom " & LastException.Message)
    End Try
      
End Sub

Public Sub getExposureCompensation As Int
    Try
        r.target = parameters
        Return r.RunMethod("getExposureCompensation")
    Catch
        Log("getExposureCompensation " & LastException.Message)
        modFun.ShowError("CameraExClass_getExposureCompensation " & LastException.Message)
        Return 0
    End Try
    
End Sub

Public Sub setExposureCompensation(v As Int)
    
    Try
        r.target = parameters
        r.RunMethod2("setExposureCompensation", v, "java.lang.int")
    Catch
        Log("setExposureCompensation " & LastException.Message)
        modFun.ShowError("CameraExClass_setExposureCompensation " & LastException.Message)
    End Try
        
End Sub

Public Sub getMinExposureCompensation As Int
    Try
        r.target = parameters
        Return r.RunMethod("getMinExposureCompensation")
    Catch
        Log("getMinExposureCompensation " & LastException.Message)
        modFun.ShowError("CameraExClass_getMinExposureCompensation " & LastException.Message)
        Return 0
    End Try
    
End Sub

Public Sub getMaxExposureCompensation As Int
    Try
        r.target = parameters
        Return r.RunMethod("getMaxExposureCompensation")
    Catch
        Log("getMaxExposureCompensation " & LastException.Message)
        modFun.ShowError("CameraExClass_getMaxExposureCompensation " & LastException.Message)
        Return 0
    End Try   
End Sub

Public Sub SetFaceDetectionListener
    Try
        Dim jo As JavaObject = nativeCam
        Dim e As Object = jo.CreateEvent("android.hardware.Camera.FaceDetectionListener", "FaceDetection", Null)
        jo.RunMethod("setFaceDetectionListener", Array(e))
    Catch
        Log("SetFaceDetectionListener " & LastException.Message)
        modFun.ShowError("CameraExClass_SetFaceDetectionListener " & LastException.Message)
    End Try
    
End Sub

Private Sub FaceDetection_Event (MethodName As String, Args() As Object) As Object
    
    Try
        
        Dim faces() As Object = Args(0)
        For Each f As Object In faces
            Dim jo As JavaObject = f
            Dim faceRect As Rect = jo.GetField("rect")
            Log(faceRect)
        Next
        Return Null
    
    Catch
        Log("FaceDetection_Event " & LastException.Message)
        modFun.ShowError("CameraExClass_FaceDetection_Event " & LastException.Message)
        Return Null
    End Try
    
End Sub



Public Sub StartFaceDetection
    
    Try
        Dim jo As JavaObject = nativeCam
        jo.RunMethod("startFaceDetection", Null)
    Catch
        Log("StartFaceDetection " & LastException.Message)
        modFun.ShowError("CameraExClass_StartFaceDetection " & LastException.Message)
    End Try
        
End Sub

Public Sub StopFaceDetection
    Try
        Dim jo As JavaObject = nativeCam
        jo.RunMethod("stopFaceDetection", Null)
    Catch
        Log("StopFaceDetection " & LastException.Message)
        modFun.ShowError("CameraExClass_StopFaceDetection " & LastException.Message)
    End Try
    
End Sub
 
Upvote 0
Top