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.
244 lines
8.4 KiB
244 lines
8.4 KiB
Build1=Default,anywheresoftware.b4a.samples.camera
|
|
File1=1.bal
|
|
FileGroup1=Default Group
|
|
Group=Default Group
|
|
Library1=camera
|
|
Library10=stringfunctions
|
|
Library2=core
|
|
Library3=javaobject
|
|
Library4=json
|
|
Library5=okhttputils2
|
|
Library6=phone
|
|
Library7=reflection
|
|
Library8=runtimepermissions
|
|
Library9=xui
|
|
ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: http://www.basic4ppc.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="26"/>~\n~<supports-screens android:largeScreens="true" ~\n~ android:normalScreens="true" ~\n~ android:smallScreens="true" ~\n~ android:anyDensity="true"/>)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~'End of default text.~\n~'************ Google Play Services Base ************~\n~AddApplicationText(~\n~ <activity android:name="com.google.android.gms.common.api.GoogleApiActivity"~\n~ android:theme="@android:style/Theme.Translucent.NoTitleBar"~\n~ android:exported="false"/>~\n~ <meta-data~\n~ android:name="com.google.android.gms.version"~\n~ android:value="@integer/google_play_services_version" />~\n~)~\n~'************ Google Play Services Base (end) ************~\n~AddApplicationText(<meta-data~\n~ android:name="com.google.android.gms.vision.DEPENDENCIES"~\n~ android:value="barcode,,face" />~\n~)~\n~
|
|
Module1=CameraExClass
|
|
Module2=Starter
|
|
NumberOfFiles=1
|
|
NumberOfLibraries=10
|
|
NumberOfModules=2
|
|
Version=11
|
|
@EndOfDesignText@
|
|
#Region Module Attributes
|
|
#FullScreen: False
|
|
#IncludeTitle: False
|
|
#ApplicationLabel: SteriScan
|
|
#VersionCode: 1
|
|
#VersionName:
|
|
#SupportedOrientations: unspecified
|
|
#CanInstallToExternalStorage: False
|
|
#End Region
|
|
#AdditionalJar: com.google.android.gms:play-services-vision
|
|
#BridgeLogger: true
|
|
'Activity module
|
|
Sub Process_Globals
|
|
Private frontCamera As Boolean = False
|
|
Private detector As JavaObject
|
|
Private SearchForBarcodes As Boolean
|
|
Private LastPreview As Long
|
|
Private IntervalBetweenPreviewsMs As Int = 100
|
|
End Sub
|
|
|
|
Sub Globals
|
|
Private Panel1 As Panel
|
|
Private camEx As CameraExClass
|
|
Private pnlDrawing As Panel
|
|
Private cvs As B4XCanvas
|
|
End Sub
|
|
|
|
Sub Activity_Create(FirstTime As Boolean)
|
|
Activity.LoadLayout("1")
|
|
If FirstTime Then
|
|
CreateDetector (Array("CODE_128", "CODE_93"))
|
|
End If
|
|
cvs.Initialize(pnlDrawing)
|
|
End Sub
|
|
|
|
Private Sub CreateDetector (Codes As List)
|
|
Dim ctxt As JavaObject
|
|
ctxt.InitializeContext
|
|
Dim builder As JavaObject
|
|
builder.InitializeNewInstance("com/google/android/gms/vision/barcode/BarcodeDetector.Builder".Replace("/", "."), Array(ctxt))
|
|
Dim barcodeClass As String = "com/google/android/gms/vision/barcode/Barcode".Replace("/", ".")
|
|
Dim barcodeStatic As JavaObject
|
|
barcodeStatic.InitializeStatic(barcodeClass)
|
|
Dim format As Int
|
|
For Each formatName As String In Codes
|
|
format = Bit.Or(format, barcodeStatic.GetField(formatName))
|
|
Next
|
|
builder.RunMethod("setBarcodeFormats", Array(format))
|
|
detector = builder.RunMethod("build", Null)
|
|
Dim operational As Boolean = detector.RunMethod("isOperational", Null)
|
|
Log("Is detector operational: " & operational)
|
|
SearchForBarcodes = operational
|
|
|
|
End Sub
|
|
|
|
Sub Camera1_Preview (data() As Byte)
|
|
If SearchForBarcodes Then
|
|
If DateTime.Now > LastPreview + IntervalBetweenPreviewsMs Then
|
|
'Dim n As Long = DateTime.Now
|
|
cvs.ClearRect(cvs.TargetRect)
|
|
Dim frameBuilder As JavaObject
|
|
Dim bb As JavaObject
|
|
bb = bb.InitializeStatic("java.nio.ByteBuffer").RunMethod("wrap", Array(data))
|
|
frameBuilder.InitializeNewInstance("com/google/android/gms/vision/Frame.Builder".Replace("/", "."), Null)
|
|
Dim cs As CameraSize = camEx.GetPreviewSize
|
|
frameBuilder.RunMethod("setImageData", Array(bb, cs.Width, cs.Height, 842094169))
|
|
Dim frame As JavaObject = frameBuilder.RunMethod("build", Null)
|
|
Dim SparseArray As JavaObject = detector.RunMethod("detect", Array(frame))
|
|
LastPreview = DateTime.Now
|
|
Dim Matches As Int = SparseArray.RunMethod("size", Null)
|
|
For i = 0 To Matches - 1
|
|
Dim barcode As JavaObject = SparseArray.RunMethod("valueAt", Array(i))
|
|
Dim raw As String = barcode.GetField("rawValue")
|
|
Log(raw)
|
|
ToastMessageShow("Found: " & raw, True)
|
|
Dim points() As Object = barcode.GetField("cornerPoints")
|
|
Dim tl As JavaObject = points(0)
|
|
' Dim tr As JavaObject = points(1)
|
|
Dim br As JavaObject = points(2)
|
|
' Dim bl As JavaObject = points(3)
|
|
Dim r As B4XRect
|
|
|
|
Dim size As CameraSize = camEx.GetPreviewSize
|
|
Dim xscale, yscale As Float
|
|
If camEx.PreviewOrientation Mod 180 = 0 Then
|
|
xscale = Panel1.Width / size.Width
|
|
yscale = Panel1.Height / size.Height
|
|
r.Initialize(tl.GetField("x"), tl.GetField("y"), br.GetField("x"), br.GetField("y"))
|
|
Else
|
|
xscale = Panel1.Width / size.Height
|
|
yscale = Panel1.Height / size.Width
|
|
r.Initialize(br.GetField("y"), br.GetField("x"), tl.GetField("y"),tl.GetField("x"))
|
|
End If
|
|
|
|
Select camEx.PreviewOrientation
|
|
Case 180
|
|
r.Initialize(size.Width - r.Right, size.Height - r.Bottom, size.Width - r.Left, size.Height - r.Top)
|
|
Case 90
|
|
r.Initialize(size.Height - r.Right, r.Top, size.Height - r.Left, r.Bottom)
|
|
End Select
|
|
r.Left = r.Left * xscale
|
|
r.Right = r.Right * xscale
|
|
r.Top = r.Top * yscale
|
|
r.Bottom = r.Bottom * yscale
|
|
cvs.DrawRect(r, Colors.Red, False, 5dip)
|
|
Next
|
|
If Matches = 0 Then
|
|
cvs.ClearRect(cvs.TargetRect)
|
|
End If
|
|
cvs.Invalidate
|
|
|
|
'Log(DateTime.Now - n)
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Sub Activity_Resume
|
|
InitializeCamera
|
|
End Sub
|
|
|
|
Private Sub InitializeCamera
|
|
Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA)
|
|
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
|
|
If Result Then
|
|
camEx.Initialize(Panel1, frontCamera, Me, "Camera1")
|
|
frontCamera = camEx.Front
|
|
End If
|
|
End Sub
|
|
|
|
Sub Activity_Pause (UserClosed As Boolean)
|
|
If camEx.IsInitialized Then
|
|
camEx.Release
|
|
End If
|
|
End Sub
|
|
|
|
Sub Camera1_Ready (Success As Boolean)
|
|
If Success Then
|
|
camEx.SetJpegQuality(90)
|
|
camEx.SetContinuousAutoFocus
|
|
camEx.CommitParameters
|
|
camEx.StartPreview
|
|
|
|
Else
|
|
ToastMessageShow("Cannot open camera.", True)
|
|
End If
|
|
End Sub
|
|
|
|
|
|
|
|
'Sub btnTakePicture_Click
|
|
' camEx.TakePicture
|
|
'End Sub
|
|
'
|
|
'Sub btnFocus_Click
|
|
' camEx.FocusAndTakePicture
|
|
'End Sub
|
|
|
|
Sub Camera1_PictureTaken (Data() As Byte)
|
|
' Dim filename As String = "1.jpg"
|
|
' Dim dir As String = File.DirRootExternal
|
|
'
|
|
' camEx.SavePictureToFile(Data, dir, filename)
|
|
' camEx.StartPreview 'restart preview
|
|
'
|
|
' 'send a broadcast intent to the media scanner to force it to scan the saved file.
|
|
' Dim Phone As Phone
|
|
' Dim i As Intent
|
|
' i.Initialize("android.intent.action.MEDIA_SCANNER_SCAN_FILE", _
|
|
' "file://" & File.Combine(dir, filename))
|
|
' Phone.SendBroadcastIntent(i)
|
|
' ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(dir, filename), True)
|
|
End Sub
|
|
|
|
Sub ChangeCamera_Click
|
|
camEx.Release
|
|
frontCamera = Not(frontCamera)
|
|
InitializeCamera
|
|
End Sub
|
|
|
|
Sub btnEffect_Click
|
|
Dim effects As List = camEx.GetSupportedColorEffects
|
|
If effects.IsInitialized = False Then
|
|
ToastMessageShow("Effects not supported.", False)
|
|
Return
|
|
End If
|
|
Dim effect As String = effects.Get((effects.IndexOf(camEx.GetColorEffect) + 1) Mod effects.Size)
|
|
camEx.SetColorEffect(effect)
|
|
ToastMessageShow(effect, False)
|
|
camEx.CommitParameters
|
|
End Sub
|
|
|
|
Sub btnFlash_Click
|
|
Dim f() As Float = camEx.GetFocusDistances
|
|
Log(f(0) & ", " & f(1) & ", " & f(2))
|
|
Dim flashModes As List = camEx.GetSupportedFlashModes
|
|
If flashModes.IsInitialized = False Then
|
|
ToastMessageShow("Flash not supported.", False)
|
|
Return
|
|
End If
|
|
Dim flash As String = flashModes.Get((flashModes.IndexOf(camEx.GetFlashMode) + 1) Mod flashModes.Size)
|
|
camEx.SetFlashMode(flash)
|
|
ToastMessageShow(flash, False)
|
|
camEx.CommitParameters
|
|
End Sub
|
|
Sub btnPictureSize_Click
|
|
Dim pictureSizes() As CameraSize = camEx.GetSupportedPicturesSizes
|
|
Dim current As CameraSize = camEx.GetPictureSize
|
|
For i = 0 To pictureSizes.Length - 1
|
|
If pictureSizes(i).Width = current.Width And pictureSizes(i).Height = current.Height Then Exit
|
|
Next
|
|
Dim ps As CameraSize = pictureSizes((i + 1) Mod pictureSizes.Length)
|
|
camEx.SetPictureSize(ps.Width, ps.Height)
|
|
ToastMessageShow(ps.Width & "x" & ps.Height, False)
|
|
camEx.CommitParameters
|
|
End Sub
|
|
|
|
|
|
Sub SeekBar1_ValueChanged (Value As Int, UserChanged As Boolean)
|
|
If UserChanged = False Or camEx.IsZoomSupported = False Then Return
|
|
camEx.Zoom = Value / 100 * camEx.GetMaxZoom
|
|
camEx.CommitParameters
|
|
End Sub |