1. Black Friday Sale - 50% off

    B4A Standard for $29 instead of $59!
    Buy Now
    Dismiss Notice

Android Question [SOLVED] Error: Array has incompatible type class...

Discussion in 'Android Questions' started by DavideV, Sep 14, 2019.

  1. DavideV

    DavideV Active Member Licensed User

    Hi developers,
    I'm getting crazy with an error that crashes my app when I try to write NDEF records to an NFC Tag.

    It looks like I'm passing wrong array type, but I can't understand:

    Here is a working code, used until now, NDEFRecords are hardcoded (R0,R1,R2...):
    Code:
    'connect to the tag, entry point for reading and writing!
    Private Sub Ndef_Connected (Success As Boolean)
        
    'Log($"Ndef reader/writer connected: ${Success}"$) 
        If Success = False Then
            NFCTagWriter_Error (Starter.mloc.Localize(
    "actwritetag_error_tag_not_connected"))
        
    Else
            
    If isWriting Then
                
    #if dev
                LogColor("ActWriteTag>Writing mode",Colors.green)
                
    #End If
     

                
    Dim R0  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(0)))
                
    Dim R1  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(1)))
                
    Dim R2  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(2)))
                
    Dim R3  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(3)))
                
    Dim R4  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(4)))
                
    Dim R5  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(5)))
                
    Dim R6  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(6)))
                
    Dim R7  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(7)))
                
    Dim R8  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(8)))
                
    Dim R9  As NdefRecord=NativeMe.RunMethod("createTextRecord",Array As Object("en",TagText(9)))
                WriteNdef(
    Array(R0,R1,R2,R3,R4,R5,R6,R7,R8,R9))
           
          

      
        
    End If
    end sub

    'write the records already created to the tag
    Private Sub WriteNdef (Records() As Object)
        
    Dim RecordsJO As JavaObject
        RecordsJO.InitializeArray(
    "android.nfc.NdefRecord", Records)
        
    Dim message As JavaObject
        message.InitializeNewInstance(
    "android.nfc.NdefMessage"Array(RecordsJO))
        
    'Write!
        TagTech.RunAsync("WriteNdef""writeNdefMessage"Array(message), 0)
     
    End Sub

    The code below does not work, but I need to use it in some way because I don't know the number of records in advance so they cannot be hardcoded...:

    Code:
    'connect to the tag, entry point for reading and writing!
    Private Sub Ndef_Connected (Success As Boolean)
        
    'Log($"Ndef reader/writer connected: ${Success}"$) 
        If Success = False Then
            NFCTagWriter_Error (Starter.mloc.Localize(
    "actwritetag_error_tag_not_connected"))
        
    Else
            
    If isWriting Then
          

                
    'new V1.15
                Dim recs(tagList.Size) As NdefRecord
                
    For x=0 To tagList.Size-1
                    
    Dim str As String=tagList.get(x)
                    
    Log("Writing record: " & str)
                    recs(x)=NativeMe.RunMethod(
    "createTextRecord",Array As Object("en",str))
                
    Next
                WriteNdef(recs)

        
    End If

    end sub

    'write the records already created to the tag
    Private Sub WriteNdef (Records() As Object)
        
    Dim RecordsJO As JavaObject
        RecordsJO.InitializeArray(
    "android.nfc.NdefRecord", Records)
        
    Dim message As JavaObject
        message.InitializeNewInstance(
    "android.nfc.NdefMessage"Array(RecordsJO))
        
    'Write!
        TagTech.RunAsync("WriteNdef""writeNdefMessage"Array(message), 0)
     
    End Sub
    The error I get is:
    Code:
    activitywritetag_writendef (java line: 3275)
    java.lang.IllegalArgumentException: 
    Array has incompatible type: class [Landroid.nfc.NdefRecord;
        at java.lang.reflect.Array.incompatibleType(
    Array.java:827)
        at java.lang.reflect.Array.set(
    Array.java:477)
        at anywheresoftware.b4j.object.JavaObject.InitializeArray(
    JavaObject.java:108)
        at sos.exteryo.com.activitywritetag._writendef(activitywritetag.java:
    3275)
        at sos.exteryo.com.activitywritetag._ndef_connected(activitywritetag.java:
    1588)
        at java.lang.reflect.Method.invoke(Native Method)
        at anywheresoftware.b4a.BA.raiseEvent2(BA.java:
    196)
        at anywheresoftware.b4a.BA$
    2.run(BA.java:370)
        at android.os.Handler.handleCallback(Handler.java:
    873)
        at android.os.Handler.dispatchMessage(Handler.java:
    99)
        at android.os.Looper.loop(Looper.java:
    193)
        at android.app.ActivityThread.main(ActivityThread.java:
    6723)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:
    495)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:
    858)
    But if I change the line:
    Code:
    WriteNdef(recs)
    to:

    Code:
    WriteNdef(Array(recs(0),recs(1),recs(2),recs(3),recs(4)))
    it works, of course limited to a known number of records, from 0 to 4 in the example

    The error line is related to:
    Code:
    RecordsJO.InitializeArray("android.nfc.NdefRecord", Records)
    in the WriteNdef sub

    Any suggestion?
    Thanks in advance
    Davide
     
    Last edited: Sep 14, 2019
  2. agraham

    agraham Expert Licensed User

    Array(x,y,z,) creates an array of Objects which is what WriteNdef is expecting.

    Try changing
    Dim recs(tagList.Size) As NdefRecord
    to
    Dim recs(tagList.Size) As Object
     
    DavideV likes this.
  3. DavideV

    DavideV Active Member Licensed User

    :cool: Great Agraham, it works now! Thank you very much!
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice