B4A Library QRCodeReaderView - QR Code Scanner that is also 100% embedded in B4A (new B4A lib files in post #8)

Here is another scanner that is 100% embedded in B4A. It wraps this Github project and will only scan QR Codes (it uses the ZXING engine for decoding scanned QR Codes). It will keep on reading QR codes for as long as what it finds a valid QR code. It is quite a "speedy" scanner. It does not require any other barcode scanner app to be installed on your device - it is 100% standalone. You can customize your B4A activity / UI by adding buttons, labels, panels, images, etc etc and change colors to your liking - 100% B4A customizable.

Note that a panel is the parent of the custom view but seeing that the original project extends Surface View it will punch a hole in the panel when the scanner starts.

Also note the permissions in the B4A project's manifest file (I know majority are redundant for this project).

You will have to handle consecutive / continuous scans of the same QR code within your B4A code.

Posting the following:
1. B4A project
2. B4A library files (3 x jar and 1 x xml) - copy them to your additional library folder.

EDIT: UPDATED LIBRARY FILES IN POST #6 THAT WILL NOT RAISE AN EVENT IN B4A IF TWO CONSECUTIVE SCANS OF THE SAME QR CODE OCCURS

1.png



Scanner.png



2.png


Some sample code:

B4X:
Region  Project Attributes
    #ApplicationLabel: QRCodeReaderView
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: False

#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Private qrcrv As QRCodeReaderView

    Private b1 As Button
    Private b2 As Button
    Private p1 As Panel
    Private l1 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("main")

    qrcrv.Visible = False


End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Sub b1_Click


    qrcrv.Visible = True
    DoEvents
    qrcrv.startScan

End Sub
Sub b2_Click

    qrcrv.stopScan
    DoEvents
    qrcrv.Visible = False

End Sub

Sub qrcrv_result_found(retval As String)

    Log("B4A: " & retval)
    l1.Text = retval

End Sub


The library:

QRCodeReaderView
Author:
Github: David L\u00e1zaro, Wrapped by: Johan Schoeman
Version: 1
QRCodeReaderView
Events:

  • result_found (retval As String)
Fields:
  • ba As BA
Methods:
  • BringToFront
  • DesignerCreateView (base As PanelWrapper, lw As LabelWrapper, props As Map)
  • Initialize (EventName As String)
  • Invalidate
  • Invalidate2 (arg0 As Rect)
  • Invalidate3 (arg0 As Int, arg1 As Int, arg2 As Int, arg3 As Int)
  • IsInitialized As Boolean
  • RemoveView
  • RequestFocus As Boolean
  • SendToBack
  • SetBackgroundImage (arg0 As Bitmap)
  • SetColorAnimated (arg0 As Int, arg1 As Int, arg2 As Int)
  • SetLayout (arg0 As Int, arg1 As Int, arg2 As Int, arg3 As Int)
  • SetLayoutAnimated (arg0 As Int, arg1 As Int, arg2 As Int, arg3 As Int, arg4 As Int)
  • SetVisibleAnimated (arg0 As Int, arg1 As Boolean)
  • startScan
  • stopScan
Properties:
  • Background As Drawable
  • Color As Int [write only]
  • Enabled As Boolean
  • Height As Int
  • Left As Int
  • Tag As Object
  • Top As Int
  • Visible As Boolean
  • Width As Int
You can download and test any posting of mine in this thread but if you want to use it then you need to
 

Attachments

  • QRCodeReaderViewLibFiles.zip
    498.1 KB · Views: 3,525
  • b4aQRCodeReaderView.zip
    8.9 KB · Views: 3,122
Last edited:

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Hello,
how do I start the qr reader, on the activity create?
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Check the example code in Post #1
That's what I did, but without success. The difference is that I dont' use a layout but I create all components by code
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
It does not change anything.
1. You should always create a NEW THREAD for any issue you have.
2. You need to use Runtimepermissions as you need to switch to TargetSDK 26
3. The code like in #1 can be used even if you add all the objects by Code.
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
It does not change anything.
1. You should always create a NEW THREAD for any issue you have.
2. You need to use Runtimepermissions as you need to switch to TargetSDK 26
3. The code like in #1 can be used even if you add all the objects by Code.

1. I didnt' create a new thread, to refer directly to this library
2. I don't use targetsdk 26
3. It doesn't work
 

aeric

Expert
Licensed User
Longtime User
I tried to change targetSdkVersion = 26 but the app crashed. I try change to 17 and run it compiled success. Then I change to 26 it compiles success. Not sure what is the problem. If I stop the B4A bridge and start again then open the project again to compile in targetSdkVersion = 26 it crash again.
 

Johan Schoeman

Expert
Licensed User
Longtime User
That's what I did, but without success. The difference is that I dont' use a layout but I create all components by code
Have done a minor change to the library to add the permissions (it was not defined in the lib before)
B4X:
@Permissions(values={"android.permission.CAMERA","android.hardware.camera","android.hardware.camera.autofocus","android.permission.VIBRATE","android.permission.FLASHLIGHT"})

The attached project is working with target SDK 26 and the views are added via code (tested with B4A V8.00 and on an Android 7.0 device).
B4A Manifest:
B4X:
AddManifestText(
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="26"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
AddPermission("android.permission.VIBRATE")
AddPermission("android.permission.CAMERA")
AddPermission("android.permission.FLASHLIGHT")
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")

Copy the attached lib files to your additional libs folder:
QRCodeReaderV102.zip (extract the jar and xml) - it should show as QRCodeReaderV102 (V1.02) in the libs tab of the B4A project
jhscore.jar

Sample B4A code:
B4X:
#Region  Project Attributes
    #ApplicationLabel: b4aQRCodeReaderViewByCode
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: False

#End Region


#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    
    Dim nativeMe As JavaObject
    Dim rp As RuntimePermissions               'ADDED 8 June 2018

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    
    
    Private b1 As Button
    Private b2 As Button
    Private p1 As Panel
    Private l1 As Label
    Private oldString As String = ""
    
    Private b3 As Button
    

    Private cb1 As CheckBox
    
    
    
    Private qrcrv As QRCodeReaderV102
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("main")
    
    p1.Initialize("")
    qrcrv.Initialize("qrcrv")
    b1.Initialize("b1")
    b2.Initialize("b2")
    b3.Initialize("b3")
    l1.Initialize("")
    cb1.Initialize("cb1")
    
    Activity.AddView(p1, 5%x, 5%y, 90%x, 50%y)
    p1.AddView(qrcrv, 7%x, 7%y, p1.Width - 14%x, p1.Height - 14%y)
    Activity.AddView(b1, p1.Left, p1.Top + p1.Height + 5%y, 35%x, 10%y)
    Activity.AddView(b2, 60%x, b1.Top, 35%x, b1.Height)
    Activity.AddView(b3, b1.Left + b1.width + 1%x, b1.top, 18%x, b1.Height)
    Activity.AddView(cb1, b1.Left, b1.Top + b1.Height + 2%y, 50%x, b1.Height)
    Activity.AddView(l1, b1.left, cb1.Top + cb1.Height + 2%y, 90%x, b1.Height)
    
    b1.Text = "Start"
    b1.TextColor = Colors.Blue
    b1.TextSize = 15
    b2.Text = "Stop"
    b2.TextColor = Colors.Blue
    b2.TextSize = 15
    b3.Text = "Torch"
    b3.TextColor = Colors.Blue
    b3.TextSize = 15
    p1.Color = Colors.Yellow
    
    cb1.Checked = False
    cb1.Text = "scan/don't scan"
    cb1.TextColor = Colors.Red
    cb1.TextSize = 15

    
    nativeMe.InitializeContext
    
    
    qrcrv.Visible = False

    'Keep the order of the next 4 lines. CAMERA_BACK and CAMERA_FRONT will only contain correct values once qrcrv.BackFacingCamera and qrcrv.FrontFacingCamera has
    'been executed else they will have default values of -1
    Log(qrcrv.BackFacingCamera)    'see the popup help when entering this method - check if there is a back facing camera and return the ID of the camera
    Log(qrcrv.FrontFacingCamera)   'see the popup help when entering this method - check if there is a front facing camera and retutn the ID of the camera
    
    Log(qrcrv.CAMERA_BACK)         'see the popup help when entering this method
    Log(qrcrv.CAMERA_FRONT)           'see the popup help when entering this method
    
    'now you can use
    qrcrv.CameraId = qrcrv.CAMERA_BACK   'or qrcrv.CameraId = qrcrv.CAMERA_FRONT
    
    'qrcrv.CameraDegrees = 270  'set this to 0, 90, 180, 270
    
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub b1_Click
    
    Dim Result As Boolean = True                                                                       'ADDED 8 June 2018
    If Not(rp.Check(rp.PERMISSION_CAMERA)) Then                                                        'ADDED 8 June 2018
        rp.CheckAndRequest(rp.PERMISSION_CAMERA)                                                       'ADDED 8 June 2018
        Wait For Activity_PermissionResult (Permission As String, Result As Boolean)                   'ADDED 8 June 2018
    End If                                                                                             'ADDED 8 June 2018
    If Result Then
      qrcrv.Visible = True
      Sleep(0)
      qrcrv.startScan
    End If 
      
End Sub

Sub b2_Click
    
    qrcrv.stopScan
    Sleep(0)
    qrcrv.Visible = False


End Sub

Sub qrcrv_result_found(retval As String)
    If oldString <> retval Then
      oldString = retval
      Log("B4A: " & oldString)
      l1.Text = oldString   
      nativeMe.RunMethod("playTone", Null)
      
    End If
    
End Sub

Sub b3_Click
    
    If (qrcrv.isFlashOn = True) Then
      qrcrv.setFlashOff
    Else
      qrcrv.setFlashOn
    End If 
    
End Sub

Sub cb1_CheckedChange(Checked As Boolean)
    
    If cb1.Checked = True Then
        qrcrv.ScanNow = True
    Else
        qrcrv.ScanNow = False
    End If
    
End Sub

#if Java

import android.media.ToneGenerator;
import android.media.AudioManager;

  public void playTone() {
      final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
      tg.startTone(ToneGenerator.TONE_PROP_BEEP);
  }     

#End If

1.png


Leaving it up to you to sort out the rest of the layout logic - but it is working by adding the views via code and targeting SDK 26.
 

Attachments

  • QRCodeReaderV102.zip
    32.3 KB · Views: 626
  • b4aQRCodeReaderViewByCode.zip
    8.3 KB · Views: 602
  • jhscore.jar
    492.4 KB · Views: 599

Johan Schoeman

Expert
Licensed User
Longtime User
I tried to change targetSdkVersion = 26 but the app crashed. I try change to 17 and run it compiled success. Then I change to 26 it compiles success. Not sure what is the problem. If I stop the B4A bridge and start again then open the project again to compile in targetSdkVersion = 26 it crash again.
See post #70
 

b4x-de

Active Member
Licensed User
Longtime User
Dear Johan, thank you very much for providing this library. My requirement is to take a photo of physical objects labeld with a qr code while passing by the camera. As soon as the camera recognizes a qr code and reads it data, a photo should be taken automatically. Scanning the qr code and reading the data with your library works perfectly.

My question is about the best way to take the photo. There seems to be no option in your library. Do you might consider it to be a useful feature for future releases of your library?

If not do you or anybody else have some advice for me how to switch from your library to another camera library back and forth? (The objects passing by quickly so the time for switching and refocus needs to be minimal.) Thank you for any help and advice!

Thomas
 

Johan Schoeman

Expert
Licensed User
Longtime User
Dear Johan, thank you very much for providing this library. My requirement is to take a photo of physical objects labeld with a qr code while passing by the camera. As soon as the camera recognizes a qr code and reads it data, a photo should be taken automatically. Scanning the qr code and reading the data with your library works perfectly.

My question is about the best way to take the photo. There seems to be no option in your library. Do you might consider it to be a useful feature for future releases of your library?

If not do you or anybody else have some advice for me how to switch from your library to another camera library back and forth? (The objects passing by quickly so the time for switching and refocus needs to be minimal.) Thank you for any help and advice!

Thomas
Try with the attached B4A project and lib files. It will return a bitmap to the B4A project when a scan occurred. Up to you to handle the bitmap from here onwards (save it as a png, etc - search the forum for how to do it).

B4X:
Sub qrcrv_result_found(retval As String, img As Object)
    If oldString <> retval Then
      oldString = retval
      Log("B4A: " & oldString)
      l1.Text = oldString   
      Dim bm As Bitmap = img
      ImageView1.Bitmap = bm
      nativeMe.RunMethod("playTone", Null)
      
    End If
    
End Sub

1.png
 

Attachments

  • QRCodeReaderV102LibFiles.zip
    32.7 KB · Views: 570
  • b4aQRCodeReaderView.zip
    10.5 KB · Views: 524

asales

Expert
Licensed User
Longtime User
I'm testing this library (thanks @Johan Schoeman ), but I get some questions:

1 - the version 1.00 works fine, but sometimes I get this line in log: "CAMERA IS NOT NULL".
This is from the library? If yes, why?

2 - I tested the other versions (1.01 and 1.02), but they don't works like the version 1.00.
I try to read a qrcode show in the computer screen (like the Whatsapp Web).
The code is read in version 1.00, but not in the others versions (using the example).
 

Johan Schoeman

Expert
Licensed User
Longtime User
I'm testing this library (thanks @Johan Schoeman ), but I get some questions:

1 - the version 1.00 works fine, but sometimes I get this line in log: "CAMERA IS NOT NULL".
This is from the library? If yes, why?

2 - I tested the other versions (1.01 and 1.02), but they don't works like the version 1.00.
I try to read a qrcode show in the computer screen (like the Whatsapp Web).
The code is read in version 1.00, but not in the others versions (using the example).
The CAMERA IS NOT NULL is probably a left over from some of the debugging that I have done.
Have you checked the checkbox? It was added subsequent to version 1 (on request). It will only return a scan if the checkbox is set or if you set in your code
qrcsv.ScanNow = True
 

asales

Expert
Licensed User
Longtime User
The CAMERA IS NOT NULL is probably a left over from some of the debugging that I have done.
OK
Have you checked the checkbox? It was added subsequent to version 1 (on request). It will only return a scan if the checkbox is set or if you set in your code qrcsv.ScanNow = True
It works to scan (version 1.02, post #74), but I get this error:
B4X:
java.lang.Exception: Sub qrcrv_result_found signature does not match expected signature.
EDITED: the code in post #70 works.
Thanks!
 

Johan Schoeman

Expert
Licensed User
Longtime User
OK

It works to scan (version 1.02, post #74), but I get this error:
B4X:
java.lang.Exception: Sub qrcrv_result_found signature does not match expected signature.
EDITED: the code in post #70 works.
Thanks!
The lib files and B4A project in post #74 go together. The signature has changed as the event raised now also returns the Bitmap of the scanned code.
 

junaidahmed

Well-Known Member
Licensed User
Longtime User
I have run above example in Android 4.It's working fine but when I run the same code in Android 6.0 and 7.0 then it's not working..

Any one has face this issue.....
 
Top