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 (TMessageResultNotification, qui 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
Thank You
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaMolto 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?
RispondiEliminaHi,
RispondiEliminaGreat example but it freezes when you click to Scan button, any idea ?
Thanks a lot!!
RispondiEliminaWhether the application of bar code scanners, as in Delphi 7?
RispondiElimina