Italian Intercettare Lettura barcode da Intent

amorosik

Expert
Licensed User
Io uso questo da 30€ da anni, funziona benissimo.


Puoi solo sparare il barcode articolo
Come fai ad inserire una quantita?
E non parlo solo per il classico inventario, ma anche per la vendita
Oppure devi andare di scanner per l'articolo e poi di tastiera pc per il resto
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Puoi solo sparare il barcode articolo
Come fai ad inserire una quantita?
E non parlo solo per il classico inventario, ma anche per la vendita
Oppure devi andare di scanner per l'articolo e poi di tastiera pc per il resto
Và collegato via bluetooth al tablet o allo smartphone.
 

udg

Expert
Licensed User
Longtime User
Come fai ad inserire una quantita?
Una soluzione artigianale basata sul solo scanner potrebbe essere quella di leggere in sequenza il codice articolo ed un codice quantità. Alcuni scanner avevano un foglio con codici numerici già pronti, ma si possono pur sempre generare.
 

Star-Dust

Expert
Licensed User
Buongiorno a tutti,
se vi interessa, ci sono riuscito.

Non appena ho tempo vedo di postare elenco delle operazioni necessarie.
Il codice che di @Gianni Sassanelli, lo trovate in questo POST, ovviamente va fatta la modifica sull'intento che suggerisce @Erel.

Premesso questo, vi posso dire che non vi servirà se non avete lo stesso dispositivo, perché quel sorgente si "aggancia" allì'intent app.dsic.BARCODE_BR_DECODING_DATA. Questo intent viene utilizzato dal dispositivo MOBILE BASE DS5
Altri dispositivi/modelli con hardware diversi si "agganciano" ad altro intent. Ad esempio con EDA51 Honeywell filtri l'intent com.honeywell.sample.action.BARCODE_DATA. Con alcuni prodotti Zebra l'intent porebbe essere com.dwexample.ACTION

Non esiste un metodo "universale" per tutti i dispositivi, ma bisogna crearne uno apposta. E non è detto che si possono gestire nella stessa maniera ne che gli intent restituiscano le informazioni nello stesso modo.

Alcuni preferiscono sfruttare l'SDK ufficiale del dispositivo che permette un maggior controllo, ma anche questa non è una strada di facile percorrenza.

Io userei sempre il metodo EMULAZIONE TASTIERA per leggere il codice a barre. Ad alcuni non piace perchè mettendo il focus su un altra vista la lettura può finire su un editText diverso da quello stabilito.
Questo è risolvibile facendo un piccolo controllo all'interno dell'evento TextChanged degli edittext, se la lettura del NEW è di 13 caratteri e tutti numerici il valore viene ricopiato nell'editText stabilito.
 

amorosik

Expert
Licensed User
Alcuni scanner avevano un foglio con codici numerici già pronti, ma si possono pur sempre generare.

Si, tempo fa' ho provato anch'io il classico foglio con 10 barcode per le migliaia, 10 per le centinaia, 10 per le decine, e 10 per le unita'
Fare si puo' fare anche, ma e' piu' un esercizio di programmazione che un sistema efficace per essere utilizzato
Nel senso che non e' per niente efficace
Il minimo sindacale credo siano quei terminali tipo il Datalogic Memor o analoghi
Terminalini dai 400 euro in su, col tastierino alfabetico/numerico e wifi
 

Gianni Sassanelli

Active Member
Licensed User
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 ...


B4X:
' 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
 
Top