Android Question Problems with [class] Google Code Scanner - Exception: Not initialized

Magma

Expert
Licensed User
Longtime User
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:

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:

Johan Schoeman

Expert
Licensed User
Longtime User
Try this

 
Upvote 0
Top