Распознавание Barcode Android

В данной статье мы будем использовать ZXing (Zebra Crossing), чтобы расшифровать штрихкод в нашем Android приложении.

Используя ZXing, нам не нужно думать о том, что у пользователя нет сканера barcode, так как классы, предоставляемые библиотекой позаботятся об этом. Интегрируя ZXing в наше приложение мы можем предоставить пользователю более простую возможность сканировать шрихкоды, также это позволит нам сфокусироваться на разработке основной части приложения.

Создание нового проекта


Шаг 1

В Eclipse создайте новый Android проект. Введите имя приложения, проекта и название пакета.


Шаг 2

Откройте основной шаблон. Eclipse должен был создать стандартный шаблон. Внутри него замените существующий контент на кнопку
<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" >
    <Button android:id="@+id/scan_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="@string/scan" />
</RelativeLayout>

После кнопки добавим два текстовых поля, которые будут отображать результаты отсканированной информации.
<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" />

Добавьте к кнопке текст. Откройте файл res/values/strings
<string name="scan">Scan</string>

Чтобы просканировать пользователь должен будет нажать на кнопку. Когда приложение получает результат распознавания, оно отобразит его в текстовых полях.

Интегрируем ZXing


Шаг 1

ZXing — библиотека с открытым исходным кодом, предоставляющая возможность распознавания штрихкодов на Android. Некоторые пользователи уже имеют установленное приложение ZXing, поэтому достаточно передать ему код и дождаться результатов. В данном приложении мы рассмотрим способ, вызывающий соответствующую функцию другого приложения. Если данное приложение отсутствует у пользователя, то будет выведено предложение скачать его.

В Eclipse добавим новый пакет в Ваш проект. Для этого кликнем правой кнопкой мыши по папке src и выберем «New»->«Package», а затем введем com.google.zxing.integration.android в качестве имени пакета.


Шаг 2

Eclipse предлагает несколько способов импортирования существующего кода в проект. В данной статье самым простым методом будет создание двух классов, содержащий код из ZXing. Кликните правой кнопкой мыши по Вашему проекту, выберете «New»->«Class» и введите «IntentIntegrator» в качестве названия класса. Остальные параметры Вы можете не изменять. Как только Вы создали класс, проделайте тоже самое, но назовите класс «IntentResult».


Скопируйте код из обоих классов библиотеки, а затем вставьте его в созданные классы.


Теперь Вы можете подключить файлы в основной класс
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

Вернемся на минутку и также подключим следующие файлы. Обратите внимание, что Eclipse мог уже их подключить за Вас
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

Изучите содержание двух классов. Изучив их Вы обнаружите, что они не считывают код. Эти два класса являются просто интерфейсами, предоставляющими доступ к функционалу сканирования.

Сканируем


Шаг 1

Давайте реализуем сканирование, когда пользователь нажимает на нашу кнопку. В главном файле приложения существует метод onCreate, который должен выглядеть примерно так
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

Перед данной функцией создайте следующие переменные, которые будут хранить нашу кнопку и два текстовых поля, созданных в шаблоне
private Button scanBtn;
private TextView formatTxt, contentTxt;

После существующего кода в onCreate добавьте строки, которые будут инициализировать переменные
scanBtn = (Button)findViewById(R.id.scan_button);
formatTxt = (TextView)findViewById(R.id.scan_format);
contentTxt = (TextView)findViewById(R.id.scan_content);

Теперь, добавим обработчик нажатия
scanBtn.setOnClickListener(this);

Расширим класс, чтобы объявить интерфейс OnClickListener
public class MainActivity extends Activity implements OnClickListener

Шаг 2

Теперь, мы можем реагировать на нажатие кнопки началом процесса сканирования. Добавим метод onClick
public void onClick(View v){
//respond to clicks
}

Проверяем, была ли нажата именно кнопка сканирования
if(v.getId()==R.id.scan_button){
//scan
}

Внутри блока с условием создадим экземпляр класса IntentIntegrator, который мы импортировали
IntentIntegrator scanIntegrator = new IntentIntegrator(this);

Сейчас, давайте вызовем процедуру, которая начнет сканирование
scanIntegrator.initiateScan();

В данный момент должно начаться распознавание, но только, если у пользователя установлено необходимое приложение. Если его нет, то будет предложено начать загрузку. Результат сканирования будет возвращен приложению.

Обработка результатов сканирования


Шаг 1

Сканер будет запущен, когда нажата кнопка. Затем будет возвращен результат сканирования в метод onActivityResult. Добавим его в наш код
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
//retrieve scan result
}

Внутри функции постараемся обработать результат
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

Шаг 2

Как и любые другие данные, полученные от другого приложения, было бы не плохо проверить, что результат не пуст. Продолжим мы только, если у нас есть правильный результат
if (scanningResult != null) {
//we have a result
}

Если мы не получили результат сканирования (например, пользователь отменил сканирование), то мы просто выведем сообщение
else{
    Toast toast = Toast.makeText(getApplicationContext(),
        "No scan data received!", Toast.LENGTH_SHORT);
    toast.show();
}

Вернемся в блок с условием, давайте разберемся с тем, что нам вернула библиотека. Объект Intent Result имеет метод, обеспечивающий получение результата сканирования. Получим результат сканирования, как строку
String scanContent = scanningResult.getContents();

Также, получим вид barcode
String scanFormat = scanningResult.getFormatName();

Шаг 3

Теперь, наше приложение имеет всю необходимую для отображения информацию. В нашей статье мы просто отобразим ее пользователю.
formatTxt.setText("FORMAT: " + scanFormat);
contentTxt.setText("CONTENT: " + scanContent);

Запустите наше приложение на реальном устройстве вместо эмулятора, чтобы увидеть, как работает функционал распознавания штрихкодов. Попробуйте просканировать штрихкод с какой-нибудь книги или любого другого товара.

Результаты сканирования

Заключение


В этой статье мы научились сканировать barcode с помощью ZXing. В ваших собственных приложениях после извлечения информации скорее-всего Вы захотите обработать ее, например, если баркод содержит URL, то перейти на нее и т.д.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 2

    0
    Я просто оставлю это здесь. habrahabr.ru/post/213291/
      0
      Вы прямо читаете мои мысли :)

      Уже несколько недель в голове витает идея создания для своих нужд Android приложения, которое сможет сканировать штрих-коды.
      Про библиотеку ZXing читал, но пока останавливало отсутствие опыта работы с Android'ом.

      Спасибо за действительно детальное описание, по которому даже новичок сможет сделать первые необходимые шаги в разработке.

      Only users with full accounts can post comments. Log in, please.