Czytnik kodów kreskowych Android

By | 11 kwietnia 2015

W tym tutorialu użyjemy bibliotekę ZXing (Zebra Crossing) aby móc skanować kody kreskowe na Androidzie. Nauczymy się wywoływać okno skanowania prosto z tej biblioteki i pobierać wynik jej działania. Nie musimy się martwić o to czy użytkownik zainstalował aplikację ZXing, ponieważ w bibliotece, której użyjemy znajdują się wszystkie potrzebne elementy.

Dzięki tej bibliotece jesteśmy w stanie skanować kody: EAN-8, EAN-13, UPC-A, Code 39, QR Code, UPC-E, Code 93, Data Matrix, Code 128, Codabar, ITF, RSS-14, RSS-Expanded, jednakże dla nas najważniejsze będą: Ean-8 i Ean-13, ponieważ znajdują się one na większości produktów, które można kupić w sklepie.

Do tworzenia aplikacji na telefon polecam program Android Studio, w którym ja sam tworzyłem, ponieważ automatycznie przygotowuje całe środowisko (wystarczy zainstalować i zacząć tworzyć).Uwaga! W ustawieniach telefonu musi być zaznaczona opcja „Debugowanie USB”, żeby móc testować aplikację podczas tworzenia.

1. Tworzenie projektu

Tworzenie nowego projektu

Tworzenie nowego projektu

Wybór platformy na którą chcemy pisać

Wybór platformy na którą chcemy pisać

Wybór typu aktywności, która ma zostać domyślnie utworzona

Wybór typu aktywności, która ma zostać domyślnie utworzona

Nazwanie nowo utworzonej aktywności

Nazwanie nowo utworzonej aktywności

2. Ustawianie wyglądu aktywności

Należy kliknąć w zakładkę "Text" aby przejść do tekstowej edycji wyglądu aktywności

Należy kliknąć w zakładkę „Text” aby przejść do tekstowej edycji wyglądu aktywności

Domyślnie wygenerowany tekst zaznaczamy i zamieniamy kodem poniżej

Domyślnie wygenerowany tekst zaznaczamy i zamieniamy kodem poniżej

 




<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<Button
 android:id="@+id/scan_button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerHorizontal="true"
 android:text="@string/scan" />

<TextView
 android:id="@+id/scan_format"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textIsSelectable="true"
 android:layout_centerHorizontal="true"
 android:layout_below="@id/scan_button" />

<TextView
 android:id="@+id/scan_content"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textIsSelectable="true"
 android:layout_centerHorizontal="true"
 android:layout_below="@id/scan_format" />

</RelativeLayout>

Po poprzedniej operacji zostanie wypisany na ekranie błąd.

Po poprzedniej operacji zostanie wypisany na ekranie błąd.

Błąd wynika z tego, że chcielibyśmy, żeby na przycisku wypisany był tekst, który znajduje się w "@string/scan". Ale co to znaczy? Chodzi o to, że niektóre wartości (np. teksty) mogą w Androidzie być przechowywane w pliku XML, dzięki czemu bardzo łatwo jest stworzyć aplikację wielojęzyczną, ładując odpowiedni plik XML, w zależności od języka.

Przechodzimy do pliku strings.xml

Przechodzimy do pliku strings.xml

Dodajemy tam kod:

<string name="scan">Scan</string>
Dopisany kod

Dopisany kod

Po przejściu do aktywności zobaczymy, że w podglądzie jest odpowiedni tekst

Po przejściu do aktywności zobaczymy, że w podglądzie jest odpowiedni tekst

W tej chwili możemy już uruchomić aplikację na telefonie, ale po naciśnięciu przycisku nic się jeszcze nie stanie.

3. Dodawanie biblioteki ZXing do aplikacji

Teraz będziemy potrzebować dwa pliki (IntentIntegrator.java i IntentResult.java), które są do pobrania tutaj. Ja osobiście pobrałem sobie wszystkie pliki ZXing z Githuba i dzięki temu mam odpowiednie ścieżki do plików. Polecam również tak zrobić.

Wyszukujemy w projekcie katalog java, klikamy prawym przyciskiem i klikamy "Show in Explorer"

Wyszukujemy w projekcie katalog java, klikamy prawym przyciskiem i klikamy "Show in Explorer"

Do otwartego katalogu kopiujemy katalog java, który po rozpakowaniu u mnie znajdował się w katalogu: C:\Users\admin\Downloads\zxing-master\zxing-master\android-integration\src\main

4. Pisanie kodu uruchamiania skanowania

Przechodzimy do kodu java aktywności

Przechodzimy do kodu java aktywności

Zaznaczamy tutaj cały kod który znajduje się w klamrze "public class MainActivity extends ActionBarActivity {"

i zamieniamy go na ten:


    //UI instance variables
    private Button scanBtn;
    private TextView formatTxt, contentTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //instantiate UI items
        scanBtn = (Button)findViewById(R.id.scan_button);
        formatTxt = (TextView)findViewById(R.id.scan_format);
        contentTxt = (TextView)findViewById(R.id.scan_content);

        //listen for clicks
        scanBtn.setOnClickListener(this);
    }

    public void onClick(View v){
        //Sprawdzanie czy został kliknięty przycisk skanowania
        if(v.getId()==R.id.scan_button){
            //instantiate ZXing integration class
            IntentIntegrator scanIntegrator = new IntentIntegrator(this);
            //start scanning
            scanIntegrator.initiateScan();
        }
    }

Uwaga! Prawdopodobnie w tej chwili na ekranie masz mnóstwo kodu który świeci na czerwono. Należy każdy taki fragment zaznaczyć, nacisnąć skrót klawiszowy "Alt + Enter" i kliknąć "Import Class".

Dzięki temu po kliknięciu przycisku zostanie wyświetlony ekran skanowania i już można skanować, ale niestety wynik skanowania nie jest jeszcze odczytywany przez naszą aplikację. W następnym punkcie dopiszemy funkcję, która obsłuży wynik skanowania.

5. Pobieranie wyników skanowania

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        //pobranie wyniku za pomocą klasy IntentResult
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        //sprawdzenie czy mamy poprawny wynik
        if (scanningResult != null) {
            //pobieramy wynik skanowania
            String scanContent = scanningResult.getContents();
            //pobieramy format kodu skanowania
            String scanFormat = scanningResult.getFormatName();
            //wyświetlamy na ekranie aplikacji
            formatTxt.setText("FORMAT: "+scanFormat);
            contentTxt.setText("CONTENT: "+scanContent);
        }
        else{
            //złe dane zostały pobrane z ZXing
            Toast toast = Toast.makeText(getApplicationContext(),
                    "No scan data received!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

Uwaga! Prawdopodobnie w tej chwili na ekranie masz mnóstwo kodu który świeci na czerwono. Należy każdy taki fragment zaznaczyć, nacisnąć skrót klawiszowy "Alt + Enter" i kliknąć "Import Class".

6. Koniec pracy

Możesz już przetestować swój program. Gotowy projekt projekt możesz pobrać stąd.

Przetestuj skaner na tym kodzie kreskowym

Przetestuj skaner na tym kodzie kreskowym

6 thoughts on “Czytnik kodów kreskowych Android

  1. Angel666

    Witam.
    Mam problem ze stworzeniem obiektu klasy IntentIntegrator kiedy przekazuję tak jak w poradniku this to wywala mi błąd typu mogę przekazać tylko Activity activity albo Fragment fragment. Ni jak nie mogę tego obejść jakaś podpowiedź??

    Reply
    1. Paweł Trojanowski Post author

      Z tego co pamiętam, to może brakować jakiegoś dziedziczenia. Na końcu artykułu dodałem link do całego kodu aplikacji. Mam nadzieję, że znajdziesz rozwiązanie 🙂

      Reply
  2. Wis

    Witam, dlaczego aplikacja korzysta z innego programu do skanowania i dobiera ją sobie ze sklepu, czy to jest wymagane do prawidłowego działania aplikacji ? Czy można już zakotwiczyć ten skaner na stałe w aplikacji?

    Reply
    1. Paweł Trojanowski Post author

      Właśnie specjalnie odinstalowałem ZXing z komórki żeby to sprawdzić. Rzeczywiście jest to problematyczne. Polecam zajrzeć na tę stronę: http://stackoverflow.com/questions/29159104/how-to-integrate-zxing-barcode-scanner-without-installing-the-actual-zxing-app

      Opisane jest w jaki sposób można to obejść, a w komentarzach już jest nawet gotowa biblioteka, która pozwala użyć aktywności odczytywania QR, czy też kodu kreskowego bez instalacji ZXing.

      Reply
  3. jan

    Witam, podczas kompilacji wyskakuje błąd:
    Error:(33, 36) error: incompatible types: MainActivity cannot be converted to OnClickListener
    nie wiem jak to obejść, jakaś podpowiedź?

    Reply
    1. Paweł Trojanowski Post author

      Szczerze mówiąc teraz ciężko mi już pomóc, bo dawno nie robiłem w Android Studio, bo zacząłem się zajmować czymś zupełnie innym. Proponuję poszukać w necie tego komunikatu błędu na angielskojęzycznych stronach.

      Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *