You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
405 lines
11 KiB
405 lines
11 KiB
B4A=true
|
|
Group=Default Group
|
|
ModulesStructureVersion=1
|
|
Type=Class
|
|
Version=7.28
|
|
@EndOfDesignText@
|
|
'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
|
|
|
|
Public PreviewOrientation As Int
|
|
End Sub
|
|
|
|
Public Sub Initialize (Panel1 As Panel, FrontCamera As Boolean, TargetModule As Object, EventName As String)
|
|
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)
|
|
End Sub
|
|
|
|
Private Sub FindCamera (frontCamera As Boolean) As CameraInfoAndId
|
|
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
|
|
Next
|
|
ci.id = -1
|
|
Return ci
|
|
End Sub
|
|
|
|
Private Sub SetDisplayOrientation
|
|
r.target = r.GetActivity
|
|
r.target = r.RunMethod("getWindowManager")
|
|
r.target = r.RunMethod("getDefaultDisplay")
|
|
r.target = r.RunMethod("getRotation")
|
|
Dim 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
|
|
PreviewOrientation = (orientation + degrees) Mod 360
|
|
result = PreviewOrientation
|
|
PreviewOrientation = (360 - PreviewOrientation) Mod 360
|
|
Else
|
|
PreviewOrientation = (orientation - degrees + 360) Mod 360
|
|
result = PreviewOrientation
|
|
Log("Preview Orientation: " & PreviewOrientation)
|
|
End If
|
|
r.target = nativeCam
|
|
r.RunMethod2("setDisplayOrientation", PreviewOrientation, "java.lang.int")
|
|
r.target = parameters
|
|
r.RunMethod2("setRotation", result, "java.lang.int")
|
|
CommitParameters
|
|
End Sub
|
|
|
|
Private Sub Camera_Ready (Success As Boolean)
|
|
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)
|
|
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
|
|
cam.TakePicture
|
|
End Sub
|
|
|
|
Private Sub Camera_PictureTaken (Data() As Byte)
|
|
CallSub2(target, event & "_PictureTaken", Data)
|
|
End Sub
|
|
|
|
Public Sub StartPreview
|
|
cam.StartPreview
|
|
End Sub
|
|
|
|
Public Sub StopPreview
|
|
cam.StopPreview
|
|
End Sub
|
|
|
|
Public Sub Release
|
|
cam.Release
|
|
End Sub
|
|
|
|
'Saves the data received from PictureTaken event
|
|
Public Sub SavePictureToFile(Data() As Byte, Dir As String, FileName As String)
|
|
Dim out As OutputStream = File.OpenOutput(Dir, FileName, False)
|
|
out.WriteBytes(Data, 0, Data.Length)
|
|
out.Close
|
|
End Sub
|
|
|
|
Public Sub SetParameter(Key As String, Value As String)
|
|
r.target = parameters
|
|
r.RunMethod3("set", Key, "java.lang.String", Value, "java.lang.String")
|
|
End Sub
|
|
|
|
Public Sub GetParameter(Key As String) As String
|
|
r.target = parameters
|
|
Return r.RunMethod2("get", Key, "java.lang.String")
|
|
End Sub
|
|
|
|
Public Sub CommitParameters
|
|
'Try
|
|
r.target = nativeCam
|
|
r.RunMethod4("setParameters", Array As Object(parameters), Array As String("android.hardware.Camera$Parameters"))
|
|
'Catch
|
|
' ToastMessageShow("Error setting parameters.", True)
|
|
' Log(LastException)
|
|
' End Try
|
|
End Sub
|
|
|
|
Public Sub GetColorEffect As String
|
|
Return GetParameter("effect")
|
|
End Sub
|
|
|
|
Public Sub SetColorEffect(Effect As String)
|
|
SetParameter("effect", Effect)
|
|
End Sub
|
|
|
|
Public Sub GetSupportedPreviewSizes As CameraSize()
|
|
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
|
|
End Sub
|
|
|
|
Public Sub SetPreviewSize(Width As Int, Height As Int)
|
|
r.target = parameters
|
|
r.RunMethod3("setPreviewSize", Width, "java.lang.int", Height, "java.lang.int")
|
|
End Sub
|
|
Public Sub GetSupportedPicturesSizes As CameraSize()
|
|
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
|
|
End Sub
|
|
|
|
Public Sub SetPictureSize(Width As Int, Height As Int)
|
|
r.target = parameters
|
|
r.RunMethod3("setPictureSize", Width, "java.lang.int", Height, "java.lang.int")
|
|
End Sub
|
|
|
|
Public Sub SetJpegQuality(Quality As Int)
|
|
r.target = parameters
|
|
r.RunMethod2("setJpegQuality", Quality, "java.lang.int")
|
|
End Sub
|
|
|
|
Public Sub SetFlashMode(Mode As String)
|
|
r.target = parameters
|
|
r.RunMethod2("setFlashMode", Mode, "java.lang.String")
|
|
End Sub
|
|
|
|
Public Sub GetFlashMode As String
|
|
r.target = parameters
|
|
Return r.RunMethod("getFlashMode")
|
|
End Sub
|
|
|
|
Public Sub GetSupportedFlashModes As List
|
|
r.target = parameters
|
|
Return r.RunMethod("getSupportedFlashModes")
|
|
End Sub
|
|
|
|
Public Sub GetSupportedColorEffects As List
|
|
r.target = parameters
|
|
Return r.RunMethod("getSupportedColorEffects")
|
|
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
|
|
r.target = parameters
|
|
Return r.RunMethod("getSupportedPreviewFpsRange")
|
|
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)
|
|
r.target = parameters
|
|
r.RunMethod4("getPreviewFpsRange", Array As Object(Range), Array As String("[I"))
|
|
End Sub
|
|
|
|
Public Sub SetPreviewFpsRange(MinValue As Int, MaxValue As Int)
|
|
r.target = parameters
|
|
r.RunMethod4("setPreviewFpsRange", Array As Object(MinValue, MaxValue), _
|
|
Array As String("java.lang.int", "java.lang.int"))
|
|
End Sub
|
|
|
|
Public Sub GetPreviewSize As CameraSize
|
|
r.target = parameters
|
|
r.target = r.RunMethod("getPreviewSize")
|
|
Dim cs As CameraSize
|
|
cs.Width = r.GetField("width")
|
|
cs.Height = r.GetField("height")
|
|
Return cs
|
|
End Sub
|
|
|
|
Public Sub GetPictureSize As CameraSize
|
|
r.target = parameters
|
|
r.target = r.RunMethod("getPictureSize")
|
|
Dim cs As CameraSize
|
|
cs.Width = r.GetField("width")
|
|
cs.Height = r.GetField("height")
|
|
Return cs
|
|
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()
|
|
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
|
|
End Sub
|
|
|
|
Public Sub GetSupportedFocusModes As List
|
|
r.target = parameters
|
|
Return r.RunMethod("getSupportedFocusModes")
|
|
End Sub
|
|
|
|
Public Sub SetContinuousAutoFocus
|
|
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
|
|
End Sub
|
|
|
|
Public Sub SetFocusMode(Mode As String)
|
|
r.target = parameters
|
|
r.RunMethod2("setFocusMode", Mode, "java.lang.String")
|
|
End Sub
|
|
|
|
Public Sub GetFocusDistances As Float()
|
|
Dim F(3) As Float
|
|
r.target = parameters
|
|
r.RunMethod4("getFocusDistances", Array As Object(F), Array As String("[F"))
|
|
Return F
|
|
End Sub
|
|
|
|
Public Sub GetSupportedPictureFormats As List
|
|
r.target = parameters
|
|
Return r.RunMethod("getSupportedPictureFormats")
|
|
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
|
|
cam.Release
|
|
r.target = cam
|
|
r.RunMethod2("releaseCameras", True, "java.lang.boolean")
|
|
End Sub
|
|
'Calls AutoFocus and then takes the picture if focus was successfull.
|
|
Public Sub FocusAndTakePicture
|
|
cam.AutoFocus
|
|
End Sub
|
|
|
|
|
|
Private Sub Camera_FocusDone (Success As Boolean)
|
|
If Success Then
|
|
Sleep(100)
|
|
TakePicture
|
|
Else
|
|
Log("AutoFocus error.")
|
|
End If
|
|
End Sub
|
|
|
|
Public Sub IsZoomSupported As Boolean
|
|
r.target = parameters
|
|
Return r.RunMethod("isZoomSupported")
|
|
End Sub
|
|
|
|
Public Sub GetMaxZoom As Int
|
|
r.target = parameters
|
|
Return r.RunMethod("getMaxZoom")
|
|
End Sub
|
|
|
|
Public Sub getZoom() As Int
|
|
r.target = parameters
|
|
Return r.RunMethod("getZoom")
|
|
End Sub
|
|
|
|
Public Sub setZoom(ZoomValue As Int)
|
|
r.target = parameters
|
|
r.RunMethod2("setZoom", ZoomValue, "java.lang.int")
|
|
End Sub
|
|
|
|
Public Sub getExposureCompensation As Int
|
|
r.target = parameters
|
|
Return r.RunMethod("getExposureCompensation")
|
|
End Sub
|
|
|
|
Public Sub setExposureCompensation(v As Int)
|
|
r.target = parameters
|
|
r.RunMethod2("setExposureCompensation", v, "java.lang.int")
|
|
End Sub
|
|
|
|
Public Sub getMinExposureCompensation As Int
|
|
r.target = parameters
|
|
Return r.RunMethod("getMinExposureCompensation")
|
|
End Sub
|
|
|
|
Public Sub getMaxExposureCompensation As Int
|
|
r.target = parameters
|
|
Return r.RunMethod("getMaxExposureCompensation")
|
|
End Sub
|
|
|
|
Public Sub SetFaceDetectionListener
|
|
Dim jo As JavaObject = nativeCam
|
|
Dim e As Object = jo.CreateEvent("android.hardware.Camera.FaceDetectionListener", "FaceDetection", Null)
|
|
jo.RunMethod("setFaceDetectionListener", Array(e))
|
|
End Sub
|
|
|
|
Private Sub FaceDetection_Event (MethodName As String, Args() As Object) As Object
|
|
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")
|
|
Next
|
|
Return Null
|
|
End Sub
|
|
|
|
|
|
|
|
Public Sub StartFaceDetection
|
|
Dim jo As JavaObject = nativeCam
|
|
jo.RunMethod("startFaceDetection", Null)
|
|
End Sub
|
|
|
|
Public Sub StopFaceDetection
|
|
Dim jo As JavaObject = nativeCam
|
|
jo.RunMethod("stopFaceDetection", Null)
|
|
End Sub
|
|
|