'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