sabato 4 ottobre 2014

Leggere e produrre Barcode con Delphi XE7 (Update)

Introduzione

In un precedente blog post, avevamo visto come sia possibile comandare via Intent applicazioni di terzi (Barcode Scanner) per implementare facilmente la funzionalità di lettura (e produzione) di un codice a barre dalla vostra applicazione Delphi (XE5) per Android.

Ho deciso, dopo alcune richieste pervenute via email, di pubblicare questo aggiornamento che sfrutta il supporto (introdotto nella versione XE6 e illustrato da Brian Long in un suo blog post) per gestire l'evento onActivityResult.

Motivazioni

Nella vecchia versione di questo esempio (per XE5), infatti, sfruttavo gli appunti di sistema e la gestione degli eventi dell'applicazione per capire quando, una volta avviata Barcode Scanner in modalità di lettura, l'utente avesse effettivamente concluso la scansione di un codice a barre.
Grazie al fatto che Barcode Scanner copia il codice scansionato negli appunti, potevo così ottenere nella mia applicazione Delphi la stringa con il testo corrispondente al codice a barre.

L'approccio, un po' primitivo, era dovuto al fatto che l'Intent veniva lanciato chiamando startActivity (una sorta di ShellExecute nel mondo Android) che non prevede un meccanismo di notifica al termine dell'Activity lanciata (nel nostro caso, al termine della scansione di un codice a barre o quando l'utente annulla l'operazione).

Nuovo approccio

Da XE6 in poi, invece, è possibile chiamare startActivityForResult che lancia l'Activity e chiede di essere notificati dell'esito dell'Activity (un po' come ShellExecuteEx permette di attendere la fine del processo lanciato nel mondo Windows). Tale notifica avviene tramite il sistema di messaging della RTL di Delphi (unit System.Messaging) e quindi è facilissimo registrare un nostro metodo (HandleActivityMessage nel mio codice) come message-listener di un messaggio specifico (TMessageResultNotificationqui c'è la lista dei messaggi supportati) ed eseguire il nostro codice applicativo al momento opportuno e con tanto di accesso a tutti gli eventuali parametri di uscita dell'Activity eseguita (nel nostro caso, ad esempio, il valore e il tipo di codice a barre scansionato).


Il codice di subscribe per il TMessageResultNotification e il metodo HandleActivityMessage

La gestione di onActivityResult, con l'estrazione degli SCAN_RESULT

Risultato della scansione: codice e tipo

Conclusioni e materiale

Di sicuro, rispetto alla versione XE5:

  • non si rischiano interferenze nella gestione degli appunti o se altre applicazioni vengono avviate (bastava l'arrivo di una telefonata e il meccanismo precedente smetteva di funzionare);
  • si ottiene l'accesso ai parametri "accessori" come il tipo di codice a barre effettivamente scansionato.

Inoltre, questo approccio è generale e può essere usato con qualunque applicazione e con qualunque Activity/Intent supportati (non solo quindi per Barcode Scanner!)

Link: Codice sorgente Delphi XE7
Link: Demo APK (da installare sul vostro dispositivo Android)

Buon lavoro e a presto,

Andrea


6 commenti:

  1. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  2. Molto interessante, ma se lancio una scansione e premo il tasto back per annullare l'operazione, oltre a chiudersi l'app zXing, termina anche l'app Demo. C'è modo di intercettare l'evento ed evitare che ciò avvenga?

    RispondiElimina
  3. Hi,

    Great example but it freezes when you click to Scan button, any idea ?

    RispondiElimina
  4. Whether the application of bar code scanners, as in Delphi 7?

    RispondiElimina