Umberto D'Ovidio

Leggere i QR Code in Android

Come si integra la funzionalità di lettura dei QR code in un’app Android? Scopriamolo insieme!

Ho preparato un semplice tutorial che fornisce un ottimo esempio di come affrontare il problema. La nostra app sarà in grado di leggere i QR code e di aprire un browser se l’informazione codificata nel QR code è un url valido. Puoi trovare il codice sorgente su Github.

La funzionalità di lettura del QR code non è integrata nella sdk android, ma bisogna, se non vogliamo fare tutto da soli, importare una libreria. La libreria più famosa e storica è senza dubbio Zxing (Zebra crossing). Noi ci serviremo di un’altra libreria basata su zxing che rende tutto più semplice.

Iniziamo dunque a darci dentro col codice! Per prima cosa, apriamo Android studio e aggiungiamo la libreria nel file build.gradle a livello app.

1compile 'me.dm7.barcodescanner:zxing:1.9.4'

Nota che non consiglio di usare l’ultima versione (che al momento è la 1.9.5) perchè sembra non funzionare in portrait mode, almeno non nel mio galaxy s5 mini.

Dobbiamo poi chiedere l’autorizzazione per accedere alla fotocamera. Per farlo aggiungiamo la seguente riga al file Android Manifest.xml.

1<uses-permission android:name="android.permission.CAMERA" />

A partire da Android 6.0 (Marshmallow) le autorizzazioni vengono richieste a runtime, le richiederemo dunque nella nostra Activity Java.

Creiamo dunque una empty Activity chiamata QrCodeReader, e aggiungiamoci il seguente codice:

 1package io.dovid.qrcodereader;
 2
 3import android.Manifest;
 4import android.app.Activity;
 5import android.app.AlertDialog;
 6import android.content.DialogInterface;
 7import android.content.Intent;
 8import android.content.pm.PackageManager;
 9import android.net.Uri;
10import android.os.Bundle;
11import android.support.v4.app.ActivityCompat;
12import android.support.v4.content.ContextCompat;
13import android.webkit.URLUtil;
14import com.google.zxing.Result;
15
16
17import me.dm7.barcodescanner.zxing.ZXingScannerView;
18
19
20public class QrCodeReader extends Activity implements ZXingScannerView.ResultHandler {
21    private ZXingScannerView mScannerView;
22    private static final int PERMESSO_FOTOCAMERA = 4725;
23
24    @Override
25    public void onCreate(Bundle state) {
26        super.onCreate(state);
27        // Richiediamo i permessi a runtime (per tutti i dispositivi >= Android 6.0)
28        if (ContextCompat.checkSelfPermission(QrCodeReader.this, Manifest.permission.CAMERA)
29                != PackageManager.PERMISSION_GRANTED) {
30            // richiediamo il permesso di utilizzare la fotocamera
31            ActivityCompat.requestPermissions(this,
32                    new String[]{Manifest.permission.CAMERA},
33                    1);
34        }
35
36        mScannerView = new ZXingScannerView(this);   // Inizializziamo la nostra scanner view
37        setContentView(mScannerView); // settiamo la nostra scannerview come content view
38    }
39
40    @Override
41    public void onResume() {
42        super.onResume();
43        mScannerView.setResultHandler(this);
44        mScannerView.startCamera();
45    }
46
47    @Override
48    public void onPause() {
49        super.onPause();
50        mScannerView.stopCamera();
51    }
52
53    @Override
54    public void handleResult(Result rawResult) {
55        String url = rawResult.getText();
56        System.out.println(url);
57        if (!URLUtil.isValidUrl(url)) {
58            AlertDialog dialog = new AlertDialog.Builder(this).
59                    setTitle("Attenzione").
60                    setMessage("Il qr code non contiene un url!").
61                    setPositiveButton("Qr code", new DialogInterface.OnClickListener() {
62                        @Override
63                        public void onClick(DialogInterface dialogInterface, int i) {
64                            dialogInterface.cancel();
65                        }
66                    }).
67                    show();
68        } else {
69            openBrowser(url);
70        }
71
72        mScannerView.resumeCameraPreview(this);
73    }
74
75    private void openBrowser(String url) {
76        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
77        startActivity(intent);
78    }
79}

Qualche commento sul codice. Prima di tutto non utilizziamo un file xml come layout in quanto usiamo la nostra ScannerView a tutto schermo. Una volta che abbiamo creato la nostra ScannerView e settato la nostra ContentView, abbiamo un QR code reader pronto per essere utilizzato! Non solo, legge anche numerosi formati di codice a barre! Infatti è possibile specificare quali formati ci interessano attraverso il metodo setFormats() chiamato sull’oggetto ScannerView. Nota che abbiamo inoltre incluso il codice che chiede a runtime il permesso di accedere alla fotocamera.

Una volta che lo scanner ha effettuato la lettura, chiama il metodo handleResult dove ci assicuriamo che il contenuto del QR code è un url che visualizziamo a browser. Se così non fosse avvertiamo l’utente con un alert dialog.