QrCode Scanner in Android App mit ZXing

Mo, 23.06.2014 - 19:22 -- Daniel Espendiller

android zxing qrcode QrCodes werden meinst im Bereich von Smartphones eingesetzt, um das lästige Tippen zu umgehen. Es gibt viele fertige QrCode Scanner Apps, man kann aber auch ziemlich einfach einen eigenen Scanner in seiner App einbinden. Für Android und JAVA bietet sich die ZXing Bibiothek an. Sie ist recht klein und kann direkt über Gradle eingebunden werden. Somit ist es mit nur ein paar Zeilen Code möglich die App um einen funktionalen QrCode Scanner zu erweitern.

build.gradle erweitern

Da ZXing doch recht mächtig ist und viele unterschiedliche Barcode Format unterstützt, darunter dann auch der QrCode, sollten wir uns auf die Core Komponenten beschränken. Diese enthalten alles um einen QrCode Scanner in der einer App einzubinden. Dank Gradle muss man zur Einbindung nur die dependencies in der build.gradle erweitern:

dependencies {
    compile 'com.google.zxing:core:2.3.0'
}

QrCode Scanner Activity

Der ZXing Scanner kann in jeder beliebigen Activity einfach als weitere Activity aufgerufen werden. Als Übergabe muss jegliche ein Callback mit onActivityResult übergeben werden:

import com.google.zxing.integration.android.IntentIntegrator;
 
// [...]
 
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView.findViewById(R.id.foo).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            IntentIntegrator.initiateScan(getActivity());
        }
    });
}

QrCode Scan Result / Callback

Wurde ein gültiger QrCode eingescannt, so wird dieser als Activity Callback übergeben. Neben dem resultCode, welche einen möglichen Fehlercode enthält, steht uns in UPCScanned am Ende der Inhalt des QrCode zur Verfügung und kann im weiteren Programmablauf genutzt werden.

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
 
public class FooActivity extends Activity {
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {
            case IntentIntegrator.REQUEST_CODE:  {
                if (resultCode != RESULT_CANCELED) {
                    IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
                    String UPCScanned = scanResult.getContents();
 
                    // QrCode inside; have fun with it
 
                } else {
                    return;
                }
                break;
            }
        }
    }
}

Disqus - noscript

Leider funktioniert das bei mir in Android Studio mit dem build gradle nicht so. muß ich da noch mehr machen?

Die Probleme, grade mit dem aktuellen Android-Studio und Gradle häufen sich leider sehr. Versuch am besten den proguard zu deaktivieren und ein gradle clear auszuführen. Dann ein Resync und es sollte funktionieren.

Da ich noch neu in der Android welt bin, tue ich mich schwer hier eine Umsetzung hinzubekommen.
In deinem Code "public View onCreate..." markiert mein AnsdroidStudio sowohl rootView als auch getActivity() rot.
Ich habe das Ganze in meine MainActivity kopiert und komme nicht weiter. Wie muss mein Layout aussehen, damit dass passt? Brauche ich irgend was spezielles?
Ich habe testweise rootView gegen (ImageButton) getauscht, da ich über diesen Button den scan triggern will, aber dann bleibt immer noch das rote getActivity(). Von wem oder was soll da der Kontext übergeben werden?

Ich hoffe, du hasst hier einen Tip für mich, der mich auf den richtigen Weg bringt.

Danke
Gunter