Ciao a tutti,
grazie all'aiuto di Erel ed altri sono riuscito ad ottenere quello che volevo, e visto l'interesse spero possa essere cosa gradita la condivisione della mia esperienza.
Quanto riporto è quanto da me capito, in base alla mia esperienza.
Ho provato diversi dispositivi Android con lettore barcode incorporato,
Zebra, Honeyvell, Datalogic, DSIC ma anche altri.
Tutti i device da me testati hanno la possibilità di trasferire il codice letto in una EditText in emulazione di tastiera.
Questo metodo è sufficiente per barcode semplici quali
EAN13 o Code39 i quali inviano una semplice stringa senza delimitatori di campo.
Quando si legge un codice a barre strutturato tipo
Code128, QRCode ecc il metodo dell'emulazione tastiera non è più sufficiente in quanto nella stringa inviata dal lettore ci sono dei caratteri di separazione campo tipo
CHR(29), CHR(102) ecc che non sono caratteri visibili e che quindi non sono presenti quando recuperiamo la variabile facendo
myVar = Edittext.Text
Ho provato ad usare l'evento
EditText.TextChanged andando a recuperare tutti i caratteri dal buffer di tastiera.
Anche questo metodo non risolve completamente la mia esigenza in quanto uno dei problemi fondamentali è che con questo metodo al massimo abbiamo a disposizione la stringa letta dal barcode ma non abbiamo mai il tipo di barcode letto.
Purtroppo nonostante diversi algoritmi provati, adattati ecc. riconoscere il tipo di barcode dalla stringa ricevuta è un lavoro impossibile.
Per questo ho dovuto per forza di cose lavorare con la
INTENT
Sempre in base alla mia esperienza ho notato che tutti i device da me testati nella app di gestione Barcode hanno il metodo INTENT, a questo punto si trattava di intercettare l'evento
on_barcode_read o similare che viene invocato dal lettore HW.
Sempre nella configurazione del lettore barcode, (tutti i device in mio possesso lo hanno)
viene messo a disposizione il nome della INTENT invocata ed il nome della ACTION
Addirittura alcuni device consentono di personalizzare il nome dell'evento.
A questo punto si trattava di capire come intercettare questo evento per completare il mio lavoro.
Ho usato la libreria
BroadCastReceiver che deve essere aggiunta al progetto.
Nel vostro progetto aggiungete un modulo di tipo
Service
Di sequito un estratto del codice ...
' Codice del modulo Main
Sub [B]Activity_Create[/B](FirstTime As Boolean)
Activity.LoadLayout("test.bal")
StartService(svc_barcode_handler) 'nome del modulo service creato in Project Add Service module
End Sub
' Fine modulo Main
' Codice del modulo svc_barcode_handler
#Region Service Attributes
#StartAtBoot: False
#End Region
Sub Process_Globals
Dim Broadcast As BroadCastReceiver ' Disponibile solo se si aggiunge la libreria
Dim sf As StringFunctions
End Sub
Sub Service_Create
Broadcast.Initialize("broadcastreceiver")
'Broadcast.Initialize("pm80")
End Sub
Sub Service_Start (StartingIntent As Intent)
Broadcast.addAction("app.dsic.barcodetray.BARCODE_BR_DECODING_DATA") ' insertire nella stringa il nome della INTENT ricavato dalla app di gestione barcode
'Broadcast.addAction("device.scanner.EVENT") ' Alcuni device hanno anche la action che deve essere inseriìta qui
'Broadcast.addCategory("android.intent.category.DEFAULT") ' non serve inserire la categoria
'Broadcast.SetPriority(2147483647)
Broadcast.SetPriority(999)
Broadcast.registerReceiver("") 'here you can add the main action (intent)
End Sub
Sub a_Service_Start (StartingIntent As Intent)
Log(StartingIntent.Action)
Service.StopAutomaticForeground 'Call this when the background task completes (if there is one)
Dim bdc, bdy,bds, e2s As String
bdc =StartingIntent.GetExtra("EXTRA_BARCODE_DECODED_DATA")
bdy =StartingIntent.GetExtra("EXTRA_BARCODE_DECODED_SYMBOLE")
bds =StartingIntent.GetExtra("EXTRA_BARCODE_DECODED_SYMBOLE_STRING")
If sf.IsEmpty(StartingIntent.Action) Then
Return
End If
e2s = StartingIntent.ExtrasToString
Dim ls As List
ls.Initialize
Try
ToastMessageShow(bdc,False)
ToastMessageShow(bdy,False)
ToastMessageShow(bds,False)
ToastMessageShow(e2s,False)
Catch
Log(LastException)
End Try
End Sub
Sub Service_Destroy
End Sub
Sub broadcastreceiver_OnReceive(Action As String, oi As Object)
Dim i As Intent
i = oi
Dim E2S, dd, ds, dss As String
E2S = i.ExtrasToString
dd = i.GetExtra("EXTRA_BARCODE_DECODED_DATA")
ds = i.GetExtra("EXTRA_BARCODE_DECODED_SYMBOLE")
dss = i.GetExtra("EXTRA_BARCODE_DECODED_SYMBOLE_STRING")
'ToastMessageShow(Action,False)
dss = Barcode_Decode(dd,dss)
End Sub