Autore Topic: [facile] Come leggere un Barcode  (Letto 22433 volte)

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
[facile] Come leggere un Barcode
« il: 24 Agosto 2010, 15:07:29 CEST »
+9
Livello di difficoltà: facile
Versione SDK utilizzata: 2.0
Link al file compresso del progetto eclipse: file in allegato
Librerie richieste: Barcode Scanner

Ho letto che qualcuno aveva bisogno di utilizzare lo scanner dei codici a barra, ho visto che non abbiamo un tutorial e quindi eccolo qui!
Ho voluto complicare un poco il tutorial inserendo altre features utili. Grazie a questo tutorial impareremo quindi a...
  • Chiamare una applicazione esterna tramite Intent che si occupa dello scan di un codice a barre;
  • Verificare che nel sistema ci sia una applicazione che soddisfa un Intent;
  • Gestire il click di un bottone direttamente dal file di layout.

Il mondo è pieno di codici a barra e secondo alcuni telefilm anche gli uomini ne avranno uno sul collo!!! Dobbiamo quindi predisporre al più presto le nostre applicazioni per recuperarli!
Per fortuna, c'è chi ha già pensato di fare un software per il riconoscimento e la codifica di questi, il nostro lavoro si riduce quindi a chiamare queste applicazioni ed attendere il risultato!
Una di queste applicazioni è Barcode Scanner, ed è anche quella che utilizzerò in questo tutorial.
Per richiamare una applicazione Android sappiamo benissimo che abbiamo bisogno di un Intent, in questo caso l'intent è il seguente:
Codice (Java): [Seleziona]
Intent SCAN_INTENT = new Intent("com.google.zxing.client.android.SCAN");
Ci basterà far partire l'Activity legata all'Intent, ed attendere il risultato:
Codice (Java): [Seleziona]
startActivityForResult(SCAN_INTENT, 0);
Come per tutti gli altri casi, il risultato di una chiamata effettuata tramite metodo startActivityForResult lo otteniamo nel metodo onActivityResult. Questo metodo ha in ingresso come parametri:
  • int requestCode
  • int resultCode
  • Intent data

Se tutto è andato a buon fine, avremo un resultCode uguale a Activity.RESULT_OK legato al requestCode passato come secondo parametro in startActivityForResult.
Il risultato dello scan lo otteniamo negli Extra dell'Intent data, in particolare esaminando la key SCAN_RESULT:
Codice (Java): [Seleziona]
String scanResult = data.getStringExtra("SCAN_RESULT");
Il gioco è fatto!

Questo tutorial presenta una feature in più: come facciamo ad essere sicuri che il sistema su cui gira la nostra applicazione sia in grado di processare il nostro Intent? Semplicemente domandandoglielo!!!
Per fare questo utilizziamo la classe di sistema PackageManager, chiedendo al sistema "Dammi informazioni su come risolvi questo Intent":
Codice (Java): [Seleziona]
ResolveInfo resolveInfo = packageManager.resolveActivity(SCAN_INTENT, PackageManager.GET_RESOLVED_FILTER);
A questo punto, se resolveInfo è diverso da null, capiamo che nel sistema c'è qualcosa che sa risolvere il nostro Intent e possiamo procedere, altrimenti blocchiamo l'utente in qualche modo (il codice che ho postato, ad esempio, disabilita il pulsante dello scan e visualizza il link per scaricare l'applicazione).

Ultima feature aggiuntiva del tutorial: gestire il click di un pulsante da file xml.
Premetto che è una cosa che a me non piace molto (IMHO sporca un poco il codice), ma è giusto conoscerne l'esistenza!
Se nel file xml di un layout all'interno del tag Button inseriamo
Codice (XML): [Seleziona]
android:onClick="onScan"al click del pulsante verrà richiamata la funzione
Codice (Java): [Seleziona]
public void onScan(View view)
in questo modo viene risparmiata la parte di codice in cui bisogna aggiungere un OnClickListener al Button (solitamente nel metodo onCreate).

Buon Barcoding a tutti!

Sorgenti:
MyBarcodeScannerActivity
Codice (Java): [Seleziona]
package com.marcoduff.mybarcodescanner;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MyBarcodeScannerActivity extends Activity {
        private static final Intent SCAN_INTENT = new Intent("com.google.zxing.client.android.SCAN");
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        PackageManager packageManager = this.getPackageManager();
        ResolveInfo resolveInfo = packageManager.resolveActivity(SCAN_INTENT, PackageManager.GET_RESOLVED_FILTER);
        if(resolveInfo==null) {
                ((Button)this.findViewById(R.id.scanButton)).setEnabled(false);
                ((TextView)this.findViewById(R.id.scanResult)).setText("Non hai installato nessuna applicazione per effettuare lo scan!!!\nScaricala qui: http://www.appbrain.com/app/com.google.zxing.client.android");
        }
    }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == Activity.RESULT_OK && requestCode == 0) {
                        String scanResult = data.getStringExtra("SCAN_RESULT");
                        ((TextView)this.findViewById(R.id.scanResult)).setText(String.format("Risultato dello scan: %1$s", scanResult));                       
                }
                else {
                        ((TextView)this.findViewById(R.id.scanResult)).setText("Operazione annullata!");
                }
        }
   
    public void onScan(View view) {
        startActivityForResult(SCAN_INTENT, 0);
    }
}

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <Button
                android:id="@+id/scanButton"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="&gt;&gt;&gt; SCAN &lt;&lt;&lt;"
                android:onClick="onScan"/>
        <TextView
                android:id="@+id/scanResult"  
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:autoLink="web"/>
</LinearLayout>

AndroidManifest.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.marcoduff.mybarcodescanner"
        android:versionCode="1"
        android:versionName="1.0">
        <application
                android:icon="@drawable/icon"
                android:label="MyBarcodeScannerActivity">
                <activity
                        android:name=".MyBarcodeScannerActivity"
                        android:label="MyBarcodeScannerActivity"
                        android:screenOrientation="landscape">
                <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
                        <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                </activity>
        </application>
        <uses-sdk android:minSdkVersion="7" />
</manifest>
« Ultima modifica: 24 Agosto 2010, 15:43:59 CEST da MarcoDuff »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Come leggere un Barcode
« Risposta #1 il: 24 Agosto 2010, 15:32:22 CEST »
0
Ottimo tutorial! ;)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

vincenzodicicco

  • Visitatore
Re:[facile] Come leggere un Barcode
« Risposta #2 il: 24 Agosto 2010, 15:38:43 CEST »
0
Molto utile,   :-) :-)

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:[facile] Come leggere un Barcode
« Risposta #3 il: 24 Agosto 2010, 15:44:30 CEST »
+1
Inserito il progetto eclipse come file in allegato! ;)

Offline alexgenovese

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    mac os X leopard
Re:[facile] Come leggere un Barcode
« Risposta #4 il: 25 Novembre 2010, 23:04:02 CET »
0
ho appena importato il progetto in eclipse ma una volta lanciato mi dice di installare : " non hai installato nessuna applicazione per effettuare lo scan..."
potresti spiegare per intero i passaggi da effettuare.. grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Come leggere un Barcode
« Risposta #5 il: 25 Novembre 2010, 23:35:15 CET »
0
Stai testando questo codice su un dispositivo reale?
Comunque ti serve aver installato Barcode Scanner sul telefono..

Offline alexgenovese

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    mac os X leopard
Re:[facile] Come leggere un Barcode
« Risposta #6 il: 26 Novembre 2010, 00:09:55 CET »
0
no emulato da eclipse. Ho installato sul dispositivo l'applicativo della zxing ma ancora devo provare ad installarlo sul dispositivo. Il mio dubbio è come importare il progetto della zxing e come far funzionare il codice che si trova in questo thread..

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Come leggere un Barcode
« Risposta #7 il: 26 Novembre 2010, 00:30:05 CET »
0
no emulato da eclipse. Ho installato sul dispositivo l'applicativo della zxing ma ancora devo provare ad installarlo sul dispositivo. Il mio dubbio è come importare il progetto della zxing e come far funzionare il codice che si trova in questo thread..
non hai capito,il progetto zxing non lo importi!
installi il programma sul dispositivo, poi dalla tua app richiami il codice e basta! è un intent,non una classe java!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline alexgenovese

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    mac os X leopard
Re:[facile] Come leggere un Barcode
« Risposta #8 il: 26 Novembre 2010, 00:37:15 CET »
0
si infatti non l'avevo capito! grazie per la chiarificazione Nicola.
Tutte le cartelle scaricate da code.google.com di zxing ( android, iphone, etc.. ) a cosa servono sostanzialmente se non possono essere modificate ?

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:[facile] Come leggere un Barcode
« Risposta #9 il: 17 Dicembre 2010, 16:19:50 CET »
0
Scusate, ma questo sistema funziona con la fotocamera dello smartphone? Perche' io dovro' avere a che fare con i codici a barre, ma tramite palmari che avranno il lettore di barcode (sara' un'applicazione che girera' su palmari industriali), ma non sono sicuro che sia questo il modo giusto. Oltretutto non sono sicuro che questa applicazione che si deve installare (barcode scanner) si possa usare senza licenza. Conoscete qualche libreria nativa di android per gestire il lettore di barcode?
Risparmia l'acqua, bevi birra...

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[facile] Come leggere un Barcode
« Risposta #10 il: 17 Dicembre 2010, 17:04:10 CET »
0
scusa per informazione, ma che palmare è quello che usi con android e il lettore barcode?

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:[facile] Come leggere un Barcode
« Risposta #11 il: 17 Dicembre 2010, 18:09:24 CET »
0
Per ora non ce l'ho, sto' lavorando con l'emulatore. C'e' un'azienda che riadatta alcuni modelli anche su android, perche' praticamente tutti i palmari di questo tipo sono per windows. Cmq il link dell'azienda e' questo: http://www.sdgsystems.com/
Risparmia l'acqua, bevi birra...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Come leggere un Barcode
« Risposta #12 il: 17 Dicembre 2010, 18:39:10 CET »
0
Io mi rivolgerei al produttore per avere delle specifiche sulle API per interagire con il barcode scanner integrato.

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:[facile] Come leggere un Barcode
« Risposta #13 il: 20 Gennaio 2011, 05:46:10 CET »
0
Scusate sono nuovo e partecipo ai post e tutorial un po in ritardo.
La domanda che mi giunge spontanea è dato che il progetto BarCode scanner è opensource è complicato usare il codice per creare un' app che fa da scan, cosi si evita di scaricare l' applicazione.

La seconda domanda è se non ho installatato il programma a cui si riferisce l' Intent posso cercare un programma diverso? Io penso di no, cioè per riassumere esiste un intent-filter capace di dirmi se in tutte le app ce nè una che fa lo scan del codice?
La domanda stupida è quella che non si fa

Offline zak84

  • Utente normale
  • ***
  • Post: 165
  • Respect: +2
    • Mostra profilo
Re:[facile] Come leggere un Barcode
« Risposta #14 il: 23 Febbraio 2011, 15:13:38 CET »
0
Scusate sono nuovo e partecipo ai post e tutorial un po in ritardo.
La domanda che mi giunge spontanea è dato che il progetto BarCode scanner è opensource è complicato usare il codice per creare un' app che fa da scan, cosi si evita di scaricare l' applicazione.
interesserebbe anche a me, perchè vorrei creare un'applicazione che sia lei un lettore di qr-code, non voglio appoggiarmi ad altre...