I am having problems with Google Code Scanner Class but not in all devices...
but some... as i can understand some devices not have the time to initialize.. moving it on b4xpage_created but getting the same error...
but try catch sometimes gives previous errors catched...
Exception: Not initialized
The code is simple that i am using in a B4XPage:
I have a thought that may be my manifest is the prob... because i am using two mlkit tech, qrcode and recognition... may be if there is a way to mix them somehow...
manifest:
The devices... may be are the same model and brand... in some works perfect... in some others taking the Exception error :-(
i am attaching also permissions - may be have some error here...
but some... as i can understand some devices not have the time to initialize.. moving it on b4xpage_created but getting the same error...
but try catch sometimes gives previous errors catched...
Exception: Not initialized
The code is simple that i am using in a B4XPage:
B4X:
at Main:
#AdditionalJar: com.android.support:support-v4
#AdditionalJar: com.google.android.gms:play-services-location
#AdditionalJar: com.google.android.gms:play-services-code-scanner
#AdditionalJar: com.google.android.gms:play-services-mlkit-text-recognition
#AdditionalJar: kotlin-stdlib-1.6.10
#AdditionalJar: androidx.arch.core:core-runtime
#AdditionalJar: com.google.android.gms:play-services-mlkit-text-recognition-chinese
#AdditionalJar: slf4j-api-1.7.30
#AdditionalJar: sslcontext-android
#MultiDex: True
...
Private Sub B4XPage_Created (Root1 As B4XView)
...
Try
If Scanner.IsInitialized=False Then
Scanner.Initialize
End If
Catch
ToastMessageShow(LastException,True) 'many times i am getting error that can;t initialize like this: Exception: Not initialized
End Try
end sub
private sub mysub
Dim formats As List = Array(Scanner.FORMAT_QR_CODE) 'For better performance pass the specific formats needed.
Wait For (Scanner.Scan(formats)) complete (Result As ScannerResult)
If Result.Success Then
Log(Result.Value)
FROMRESULT=Result.Value
...
complete2.Enabled=True
Else
Dim prob As String=LastException
ToastMessageShow(prob.trim & " - try again!",False)
End If
end sub
the class:
'version: 1.00
Sub Class_Globals
Public Const FORMAT_ALL_FORMATS = 0, FORMAT_AZTEC = 4096, FORMAT_CODABAR = 8, FORMAT_CODE_128 = 1, FORMAT_CODE_39 = 2, FORMAT_CODE_93 = 4 As Int
Public Const FORMAT_DATA_MATRIX = 16, FORMAT_EAN_13 = 32, FORMAT_EAN_8 = 64, FORMAT_ITF = 128, FORMAT_PDF417 = 2048, FORMAT_QR_CODE = 256 As Int
Public Const FORMAT_UPC_A = 512, FORMAT_UPC_E = 1024 As Int
Type ScannerResult (Success As Boolean, Value As String, Barcode As JavaObject)
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
End Sub
Public Sub Scan (Formats As List) As ResumableSub
Dim builder As JavaObject
builder.InitializeNewInstance("com/google/mlkit/vision/codescanner/GmsBarcodeScannerOptions.Builder".Replace("/", "."), Null)
Dim f(Formats.Size - 1) As Int
For i = 1 To Formats.Size - 1
f(i - 1) = Formats.Get(i)
Next
builder.RunMethod("setBarcodeFormats", Array(Formats.Get(0), f))
' builder.RunMethod("enableAutoZoom", Null)
Dim options As JavaObject = builder.RunMethod("build", Null)
Dim scanning As JavaObject
Dim ctxt As JavaObject
ctxt.InitializeContext
Dim scanner As JavaObject = scanning.InitializeStatic("com/google/mlkit/vision/codescanner/GmsBarcodeScanning".Replace("/", ".")).RunMethod("getClient", Array(ctxt, options))
Dim o As JavaObject = scanner.RunMethod("startScan", Null)
Do While o.RunMethod("isComplete", Null).As(Boolean) = False
Sleep(50)
Loop
Dim res As ScannerResult
res.Initialize
If o.RunMethod("isSuccessful", Null) Then
res.Success = True
res.Barcode = o.RunMethod("getResult", Null)
res.Value = res.Barcode.RunMethod("getRawValue", Null)
Else
Log("task failed")
Log(o.RunMethod("getException", Null))
End If
Return res
End Sub
I have a thought that may be my manifest is the prob... because i am using two mlkit tech, qrcode and recognition... may be if there is a way to mix them somehow...
manifest:
B4X:
'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="24" android:targetSdkVersion="34"/>
<supports-screens android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
CreateResourceFromFile(Macro, Themes.LightTheme)
'End of default text.
CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase) 'add if not already there
'******* google code scanner
AddApplicationText(
<meta-data
android:name="com.google.mlkit.vision.DEPENDENCIES"
android:value="barcode_ui"/>
<activity
android:name="com.google.mlkit.vision.codescanner.internal.GmsBarcodeScanningDelegateActivity"
android:exported="false"
android:screenOrientation="portrait"
>
</activity>
)
'*****************
'********* ML kit **********
AddApplicationText(
<activity
android:name="com.google.mlkit.vision.documentscanner.internal.GmsDocumentScanningDelegateActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
>
</activity>
<provider
android:name="com.google.mlkit.common.internal.MlKitInitProvider"
android:authorities="${applicationId}.mlkitinitprovider"
android:exported="false"
android:initOrder="99" />
<service
android:name="com.google.mlkit.common.internal.MlKitComponentDiscoveryService"
android:directBootAware="true"
android:exported="false"
>
<meta-data
android:name="com.google.firebase.components:com.google.mlkit.common.internal.CommonComponentRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar" />
</service>
)
'******************************
'****** text recognition *****
AddApplicationText(
<meta-data
android:name="com.google.mlkit.vision.DEPENDENCIES"
android:value="ocr" />
)
'**********
'********* ML kit + subject segmentation + text recognition **********
AddApplicationText(
<activity
android:name="com.google.mlkit.vision.documentscanner.internal.GmsDocumentScanningDelegateActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
>
</activity>
<provider
android:name="com.google.mlkit.common.internal.MlKitInitProvider"
android:authorities="${applicationId}.mlkitinitprovider"
android:exported="false"
android:initOrder="99" />
<service
android:name="com.google.mlkit.common.internal.MlKitComponentDiscoveryService"
android:directBootAware="true"
android:exported="false"
>
<meta-data
android:name="com.google.firebase.components:com.google.mlkit.common.internal.CommonComponentRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar" />
<meta-data
android:name="com.google.firebase.components:com.google.mlkit.vision.segmentation.subject.internal.SubjectSegmentationRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar" />
<meta-data
android:name="com.google.firebase.components:com.google.mlkit.vision.text.internal.TextRegistrar"
android:value="com.google.firebase.components.ComponentRegistrar" />
</service>
)
'******************************
'AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)
AddPermission(android.permission.SCHEDULE_EXACT_ALARM)
AddPermission(android.permission.POST_NOTIFICATIONS)
AddPermission(android.permission.FOREGROUND_SERVICE)
AddPermission(android.permission.INTERNET)
AddPermission(android.permission.RECORD_AUDIO)
AddPermission(android.permission.CAMERA)
AddPermission(android.permission.READ_PHONE_STATE)
AddPermission(android.permission.ACCESS_FINE_LOCATION)
AddPermission(android.permission.ACCESS_COARSE_LOCATION)
'AddPermission(android.permission.QUERY_ALL_PACKAGES)
AddApplicationText(
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="$PACKAGE$.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
)
CreateResource(xml, provider_paths,
<files-path name="name" path="shared" />
)
AddManifestText(
<queries>
<package android:name="com.google.android.apps.docs" />
</queries>
)
'IME
'SetActivityAttribute(main, android:windowSoftInputMode, adjustResize|stateHidden)
SetActivityAttribute(main, android:windowSoftInputMode, adjustPan|stateHidden)
'Receive files
AddActivityText(Main,
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>)
'SetActivityAttribute(main, android:windowSoftInputMode, adjustPan|stateHidden)
'add those because GMS scanning not works always - for zxing
AddManifestText(<uses-feature android:name="android.hardware.telephony" android:required="false" />)
AddManifestText(<uses-feature android:name="android.hardware.camera" android:required="false" />)
AddManifestText(<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />)
AddManifestText(<uses-feature android:name="android.hardware.camera.flash" android:required="false" />)
AddPermission("android.permission.WAKE_LOCK")
AddPermission("android.permission.DEVICE_POWER")
AddPermission("android.permission.READ_PHONE_STATE")
AddPermission("android.permission.VIBRATE")
The devices... may be are the same model and brand... in some works perfect... in some others taking the Exception error :-(
i am attaching also permissions - may be have some error here...
B4X:
Dim Phone As Phone
aver=Phone.SdkVersion
For Each permission As String In Array(rp.PERMISSION_RECORD_AUDIO, rp.PERMISSION_READ_PHONE_STATE, rp.PERMISSION_CAMERA, rp.PERMISSION_ACCESS_FINE_LOCATION, rp.PERMISSION_POST_NOTIFICATIONS)
rp.CheckAndRequest( permission )
Wait For B4XPage_PermissionResult( permission As String, Result As Boolean )
If Result = False Then
ToastMessageShow( "Δεν δώσατε δικαιώματα στην εφαρμογή, άρα δεν μπορείτε να την χρησιμοποιήσετε !", True )
ExitApplication
Return
End If
Next
If aver>33 Then
Wait For (CheckAndRequestNotificationPermission) Complete (HasPermission As Boolean)
If HasPermission Then
Log("ok for notifications...")
Else
Msgbox2Async("Πρέπει να δώσετε δικαιώματα να στέλνουμε ειδοποιήσεις, για να δουλεύει σωστά η εφαρμογή... Δεν δώσατε δικαιώματα, θα χρειαστεί επανεγκατάσταση !", "Προσοχή!", "OK", "", "", Null, False)
End If
Else
If aver<24 Then
If AreNotificationsEnabled = False Then
Msgbox2Async("Πρέπει να δώσετε δικαιώματα να στέλνουμε ειδοποιήσεις, για να δουλεύει σωστά η εφαρμογή...", "Προσοχή!", "OK", "", "Με τίποτα !!!", Null, False)
Wait For Msgbox_Result (Result1 As Int)
If Result1 = DialogResponse.POSITIVE Then
Wait For (AskForEnableNotifications) Complete (nAskingStatus As Int)
If AreNotificationsEnabled = False Then ExitApplication
Else
Return
End If
End If
Else
If CheckScheduleExactAlarmsPermission = 0 Then
Msgbox2Async("Πρέπει να δώσετε δικαιώματα να στέλνουμε ειδοποιήσεις, για να δουλεύει σωστά η εφαρμογή...", "Προσοχή!", "OK", "", "Με τίποτα !!!", Null, False)
Wait For Msgbox_Result (Result1 As Int)
If Result1 = DialogResponse.POSITIVE Then
Wait For (AskForScheduleExactAlarmsPermission) Complete (rAskingStatus As Int)
If CheckScheduleExactAlarmsPermission <> 1 Then ExitApplication
Else
ExitApplication
End If
End If
End If
End If
....
'sdk 31---follow
Private Sub StartActivityForResult(i As Intent)
Dim jo As JavaObject = GetBA
ion = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null)
jo.RunMethod("startActivityForResult", Array(ion, i))
End Sub
Private Sub GetBA As Object
Dim jo As JavaObject
Dim cls As String = Me
cls = cls.SubString("class ".Length)
jo.InitializeStatic(cls)
Return jo.GetField("processBA")
End Sub
Private Sub AskForScheduleExactAlarmsPermission As ResumableSub
Try
Dim IN As Intent
IN.Initialize("android.settings.REQUEST_SCHEDULE_EXACT_ALARM", "package:" & Application.PackageName)
StartActivityForResult(IN)
Wait For ion_Event (MethodName As String, Args() As Object)
Args(0) = 0 'User cancel
Args(0) = -1 'User allow
' If Args.Length > 0 Then
' Return Args(0).As(Int)
' Else
' Return -3
' End If
Return 1
Catch
'Log(LastException)
Return -1
End Try
End Sub
Private Sub CheckScheduleExactAlarmsPermission As Int
Try
If Phone.SdkVersion < 31 Then
' Μέθοδος δεν υποστηρίζεται
Return -3
End If
Dim oConText As JavaObject
Dim oAlarmManager As JavaObject
Dim IsScheduleExactAlarmsAllowed As Boolean = False
oConText.InitializeContext
oAlarmManager = oConText.RunMethod("getSystemService", Array("alarm"))
If oAlarmManager.IsInitialized Then
IsScheduleExactAlarmsAllowed = oAlarmManager.RunMethod("canScheduleExactAlarms", Null).As(Boolean)
If IsScheduleExactAlarmsAllowed Then
Return 1 ' Ναι, επιτρέπεται
Else
Return 0 ' Όχι, δεν επιτρέπεται
End If
Else
Return -2 ' AlarmManager δεν είναι διαθέσιμο
End If
Catch
'Log(LastException)
Return -1 ' Σφάλμα κατά την εκτέλεση
End Try
End Sub
Private Sub AreNotificationsEnabled As Boolean
Try
Dim nJO As JavaObject
Dim ctxt As JavaObject
ctxt.InitializeContext
nJO = nJO.InitializeStatic("android.support.v4.app.NotificationManagerCompat").RunMethod("from", Array(ctxt))
'areNotificationsEnabled method Added in API level 24
Return nJO.RunMethod("areNotificationsEnabled", Null)
Catch
Return False
End Try
End Sub
Private Sub AskForEnableNotifications As ResumableSub
Try
Dim IN As Intent
'android.settings.APP_NOTIFICATION_SETTINGS Added in API level 26
IN.Initialize("android.settings.APP_NOTIFICATION_SETTINGS", "")
IN.Flags = 268435456 'FLAG_ACTIVITY_NEW_TASK
IN.PutExtra("android.provider.extra.APP_PACKAGE", Application.PackageName)
StartActivityForResult(IN)
Wait For ion_Event (MethodName As String, Args() As Object)
Return 1
Catch
Return -1
End Try
End Sub
'Make sure that targetSdkVersion >= 33
Private Sub CheckAndRequestNotificationPermission As ResumableSub
Try
Dim p As Phone
If p.SdkVersion < 33 Then Return True
Dim ctxt As JavaObject
ctxt.InitializeContext
Dim targetSdkVersion As Int = ctxt.RunMethodJO("getApplicationInfo", Null).GetField("targetSdkVersion")
If targetSdkVersion < 33 Then Return True
Dim NotificationsManager As JavaObject = ctxt.RunMethod("getSystemService", Array("notification"))
Dim NotificationsEnabled As Boolean = NotificationsManager.RunMethod("areNotificationsEnabled", Null)
If NotificationsEnabled Then Return True
Dim rp As RuntimePermissions
rp.CheckAndRequest(rp.PERMISSION_POST_NOTIFICATIONS)
Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages.
Log(Permission & ": " & Result)
Return Result
Catch
Return True
End Try
End Sub
Last edited: