Встроить библиотеку Zxing без использования приложения Barcode Scanner

Каков предпочтительный способ встраивания библиотеки zxing для обеспечения сканирования без установки приложения Barcode Scanner? Я хочу встроить его в Android, не запрашивая у пользователя никаких дополнительных установок. (Аналогично тому, как работает iPhone src).


person Joey Schluchter    schedule 31.01.2011    source источник
comment
Загрузите компоненты ядра и javase и, возможно, вставьте их.   -  person James Black    schedule 31.01.2011
comment
Но вам нужно посмотреть лицензию и посмотреть, что вам разрешено делать, можете ли вы просто включить это в свою программу.   -  person James Black    schedule 31.01.2011


Ответы (7)


На самом деле проще интегрировать через Intent. Более надежный, и вы получаете обновления автоматически. Пока не советую...

Полный исходный код доступен в проекте ZXing. Вы хотите собрать core.jar из core/ и поместить его в папку Android lib/, чтобы включить основной декодер в свое приложение. Вы не хотите включать javase. Вы можете просмотреть код в android/, так как он является исходным кодом для сканера штрих-кода, но как авторы мы предлагаем вам не просто копировать и вставлять его.

Это лицензия Apache, что означает, что вы можете использовать его свободно, если вы по существу предоставить пользователю доступ к условиям лицензии.

person Sean Owen    schedule 31.01.2011
comment
Разве не имеет смысла иметь версию библиотеки Android? Иногда просить пользователей загрузить стороннее приложение просто не решение... - person MasterScrat; 05.08.2011
comment
Библиотечное решение уже есть: core.jar. Все приложение для Android также доступно для повторного использования (и иногда неэтично копируется). Я не уверен, что может быть проще. - person Sean Owen; 05.08.2011
comment
Помимо core.jar существует много специфичного для Android кода. Я думаю, что MasterScrat просил проект библиотеки Android. Что-то, что дало бы вам просмотры и поддержку камеры и т. Д., Без всего, что нужно BarcodeScanner. - person pforhan; 24.07.2012
comment
Я это понимаю. Части, которые можно повторно использовать как библиотеку, уже доступны в ядре. Код Android не так упаковывается; source, вероятно, является наиболее значимой «упаковкой» для этих битов. Предоставление полного встраиваемого пользовательского интерфейса не является целью — все приложение уже доступно Intent как API. - person Sean Owen; 24.07.2012
comment
@SeanOwen Я только что скачал Zxing и не могу найти core.jar в папке Core .. Где я могу его найти? - person ; 29.05.2013
comment
Вероятно, лучше всего задавать вопросы на groups.google.com/forum/?fromgroups#! форум/zxing . Вы можете собрать его из имеющегося у вас исходного кода, использовать Maven, чтобы он зависел от него в вашем проекте Maven, или получить .jar напрямую из репозитория Maven: search.maven.org/ - person Sean Owen; 30.05.2013
comment
Здравствуйте, @SeanOwen, у меня к вам вопрос. Можем ли мы реализовать сравнение штрих-кода с помощью zxing - person Umesh Suryawanshi; 18.12.2013
comment
Вау core.jar выходит 126 Мб. Это довольно много для приложения для Android. Имеет ли это смысл? - person CodyBugstein; 07.10.2014
comment
@Imray Не уверен, на что ты смотришь. Это около 0,5 МБ: search.maven.org / Меньше после того, как proguard уменьшит размер. - person Sean Owen; 07.10.2014
comment
@SeanOwen Я смотрю на папку core в zxing-master со страницы Github. - person CodyBugstein; 07.10.2014
comment
@Imray, тогда вы также смотрите на размер всех тестовых изображений. Это, конечно, не часть артефакта. - person Sean Owen; 07.10.2014
comment
@SeanOwen, так о каком core ты говоришь? - person CodyBugstein; 10.10.2014
comment
@Изображайте фактически опубликованный артефакт, от которого вы будете зависеть в своем проекте и встраивать в свое приложение: search.maven.org/ - person Sean Owen; 10.10.2014
comment
Кажется, нет руководства по встроенному ZXing в Android-приложение (и я не знаю, почему). Вместо этого просто использовал ZBar. - person Konstantin Konopko; 10.12.2015
comment
@konopko руководство github.com/zxing/zxing/wiki/Scanning-Via -Намерение - person Sean Owen; 11.12.2015
comment
@SeanOwen Дорогой Шон, я думаю, ты не совсем понимаешь, чего хотят люди. Они (и я тоже) не хотят использовать ваше отличное приложение Barcode Scanner через Intent, потому что пользователь должен установить дополнительное приложение (плохой UX). Мы хотим ВСТРОИТЬ библиотеку QR в наши приложения. - person Konstantin Konopko; 11.12.2015
comment
@konopko библиотека декодирования уже разбита как библиотека. Вы просто хотите, чтобы готовое приложение клонировалось. Я не хочу, чтобы ты это делал. Это не совсем то, как работает Android. Ваш и другие аргументы заключаются в том, что это будет проще или выгоднее, чем создавать собственное приложение. Я не нахожу это убедительным. - person Sean Owen; 11.12.2015
comment
Требовать, чтобы пользователи загружали стороннее приложение для такой разовой задачи, — это плохой пользовательский опыт. - person Otieno Rowland; 08.01.2016
comment
@RowlandMtetezi, тогда вам следует создать собственный встроенный считыватель QR-кодов, используя эту библиотеку. Это твоя работа. Намерения также являются опцией. - person Sean Owen; 09.01.2016

Android QR/штрих-код/мультиформатный декодер.

Я сделал приложение для Android, используя API-интерфейсы ZXing, и внедрил в свое приложение только код декодирования. Ввод в этот декодер осуществлялся через SD-карту эмулятора Android.

Вот шаги:

  1. Сначала я создал AVD (эмулятор) версии 4 в Eclipse IDE с включенными функциями SD-карты и камеры.

  2. Затем я создал SDCard, используя приведенные ниже команды в командной строке:

    c:\>mksdcard 40M mysdcard.iso
    

где 40M — размер SD-карты, которую я создал. Она будет сохранена на диске C:. Обратите внимание, что часть .iso важна.

  1. Затем нам нужно смонтировать SD-карту в эмулятор, используя приведенные ниже команды в командной строке:

     c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
    

Здесь myavd4 — это имя виртуального устройства эмулятора/андроида, которое я создал на шаге 1. Знак «@» перед именем avd также важен.

Держите эмулятор работающим все время. Если он закроется, нам придется повторить 3 вышеуказанных шага.

  1. Мы можем отправить QR-код или другие изображения кода, которые у нас есть, на эту SD-карту, установленную на нашем эмуляторе, с помощью приведенных ниже команд в командной строке:

    c:\>adb push "c:\myqrcode.png" /sdcard
    
  2. Затем в Eclipse IDE запустите новый проект Android. Код ниже нужно вставить в файл QRDecoder.java нашего проекта.

    package com.example.palani;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.ChecksumException;
    import com.google.zxing.FormatException;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Reader;
    import com.google.zxing.Result;
    import com.google.zxing.ResultPoint;
    import com.google.zxing.client.androidtest.RGBLuminanceSource;
    import com.google.zxing.common.HybridBinarizer;
    public class QRDecoder extends Activity implements OnClickListener {
        public static class Global
        {
            public static String text=null;
        }
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Bitmap bMap = BitmapFactory.decodeFile("/sdcard/myqrcode.png");
            TextView textv = (TextView) findViewById(R.id.mytext);
            View webbutton=findViewById(R.id.webbutton);
            LuminanceSource source = new RGBLuminanceSource(bMap); 
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            Reader reader = new MultiFormatReader();
            try {
                 Result result = reader.decode(bitmap);
                 Global.text = result.getText(); 
                    byte[] rawBytes = result.getRawBytes(); 
                    BarcodeFormat format = result.getBarcodeFormat(); 
                    ResultPoint[] points = result.getResultPoints();
                    textv.setText(Global.text);
                    webbutton.setOnClickListener(this);
            } catch (NotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ChecksumException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FormatException e) {
                // TODO Auto-generated catch block
        e.printStackTrace();
    
    
            }   
        }
    
        @Override
        public void onClick(View v) {
            Uri uri = Uri.parse(Global.text); 
            Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
            startActivity(intent);
    
        }
    
    }
    
  3. Затем я скачал исходный код ZXing (ZXing-1.6.zip) по ссылке ниже.

    http://code.google.com/p/zxing/downloads/list
    

Затем распакуйте его и перейдите в папку D:\zxing-1.6\core\src\com.

скопируйте папку com и вставьте ее в наш пакет в Eclipse.

(Обратите внимание, щелкните правой кнопкой мыши пакет нашего проекта и вставьте... если он попросит заменить существующую папку, выберите «Да»)

  1. Затем скопируйте и вставьте приведенный ниже код в файл res/layout/main.xml.

    <?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"
        android:padding="20dip"
        >
    
    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    
    android:textColor="@color/mbackground1"
    android:gravity="center_horizontal"
    android:text="@string/decode_label"
    android:padding="20dip" 
    />
    
    <TextView
    android:id="@+id/mytext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:background="@color/mbackground2" 
    android:textColor="@color/mytextcolor" 
    android:padding="20dip"
    />
    
    
     <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/continue_label"
    android:gravity="center_horizontal"
    android:textColor="@color/mytextcolor"
    android:padding="20dip"
    />
    
    <Button 
    android:id="@+id/webbutton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/web_button"
    android:textColor="@color/mytextcolor"
    />
    
    </LinearLayout>
    
  2. Затем скопируйте и вставьте приведенный ниже код в файл res/values/strings.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">Hello World, QRDecoder!</string>
        <string name="app_name">QRDecoder</string>
        <string name="continue_label">Click below to load the URL!!</string>
        <string name="web_button">Load the URL!!</string>
        <string name="decode_label">Decoded URL</string>
    
    </resources>
    
  3. Затем скопируйте и вставьте приведенный ниже код в файл res/values/color.xml, если он не существует, создайте его.

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <color name="mbackground1">#7cfc00</color>
    <color name="mbackground2">#ffff00</color>
    <color name="mytextcolor">#d2691e</color>
    </resources>
    
  4. Затем скопируйте и вставьте приведенный ниже код в файл манифеста после открывающего тега.

    <manifest>
    
    
    <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />      
    
  5. Итак, вышеописанные шаги выполнены... наше приложение готово. Теперь вы можете запустить приложение, и оно даст вам декодированный результат входного изображения, которое мы дали.

  6. Чтобы изменить ввод, отправьте другой файл на SD-карту, используя приведенную ниже команду в командной строке.

    c:\>adb push "c:\image2.png" /sdcard
    

и измените ввод в нашем QRDecoder.java, чтобы отразить тот же

    Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");

входные данные могут быть любого формата, такого как QRCode, штрих-код и т. д. Типы изображений могут быть bmp, jpg или png.

Я использовал приведенный ниже веб-сайт для создания QR-кодов для целей тестирования.

http://barcode.tec-it.com/

И http://qrcode.kaywa.com

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

person Palani Babu    schedule 10.02.2011
comment
Отличное описание. Действительно помог мне запустить мой считыватель штрих-кодов. Спасибо! - person Betaminos; 21.08.2012

Если вы следуете ответу Палани и хотите импортировать только ядро ​​zxing. Вот как вы можете использовать RGBLuminanceSource без импорта zxing.androidtest.

// import com.google.zxing.client.androidtest.RGBLuminanceSource;
import com.google.zxing.RGBLuminanceSource;

// Bitmap mBitmap; // some bitmap...

int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
int[] pixels = new int[width * height];
mBitmap.getPixels(pixels, 0, width, 0, 0, width, height);

RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);

BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));

try {
   Result result = zxingReader.decode(binaryBitmap);
} catch (Exception e) {
   e.printStackTrace();
}
person Rui Marques    schedule 01.02.2014
comment
Да, это то, что я показал здесь вместо использования RGBLuminanceSource из com.google.zxing.client.androidtest, как в ответе Палани, который имеет другие параметры. - person Rui Marques; 02.02.2014

Теперь вы можете использовать официальный API штрихкодов от Google:

API штрих-кодов обнаруживает штрих-коды в режиме реального времени на устройстве и в любой ориентации. Он также может обнаруживать несколько штрих-кодов одновременно.

Он считывает следующие форматы штрих-кодов:

  • Одномерные штрих-коды: EAN-13, EAN-8, UPC-A, UPC-E, Code-39, Code-93, Code-128, ITF, Codabar
  • 2D штрих-коды: QR-код, матрица данных, PDF-417, AZTEC

Он автоматически анализирует QR-коды, матрицу данных, PDF-417 и значения Aztec для следующих поддерживаемых форматов:

  • URL-адрес
  • Контактная информация (VCARD и т.д.)
  • Календарное событие
  • Электронное письмо
  • Телефон
  • смс
  • ISBN
  • Вай-фай
  • Геолокация (широта и долгота)
  • Водительское удостоверение / удостоверение личности AAMVA
person FireZenk    schedule 18.08.2015
comment
Только если у вашего пользователя есть активное интернет-соединение, не подходит для нашего склада! - person dave; 25.01.2016
comment
для использования этого API Google Play требуется версия 7.8. - person Milon; 24.05.2016
comment
@DanDascalescu: Я так и сделал в то время, наша складская сеть не имеет связи с внешним миром, и использование кода привело к ошибке, поскольку последнюю версию сервисов Google Play невозможно было проверить / загрузить. Само сканирование может быть локальным, но требование сервиса google play не было. Я не тестировал его снова в последнее время, поэтому не знаю, изменилось ли это. - person dave; 11.08.2016
comment
@dave: Может быть, после установки последних сервисов Google Play сканирование будет работать локально? - person Dan Dascalescu; 11.08.2016
comment
@DanDascalescu Может быть, если снова возникнет потребность в чем-то подобном, я попробую, основная проблема в том, что у единиц нет привязанной к ним учетной записи Google, поэтому их можно обновить! - person dave; 12.08.2016

Я сам попробовал этот метод, и больше всего мне показалось, что он работает.

Хотя у меня есть несколько моментов, чтобы сделать

  1. Он будет жаловаться на пакет com.google.zxing.client.androidtest, который необходим для класса RGBLuminanceSource, найденного в пакете и используемого в действии QRDecoder. Поэтому также импортируйте пакет zxing/androidtest.

  2. Если вы добавляете библиотеку Zxing вне своего пакета, вам нужно будет отредактировать все ссылки на R.java, поскольку он не найдет файл R.java в своем пакете.

Например:

Вместо

mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);

в файле BenchmarkActivity.java используйте

mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);

Мы также можем использовать интерфейс DDMS Eclipse для передачи QRCode на SDCard устройства.

Использование DDMS

person Sankalp    schedule 21.02.2012

https://github.com/dm77/barcodescanner

Я предпочел эту библиотеку Сервисам Google Play, потому что, как обычно, для Сервисов Google Play требуется та же версия, установленная на устройстве.

Он встраивает Zxing в новую систему сборки и предоставляет файл aar. Очень круто.

person tbruyelle    schedule 29.10.2015

Какое-то время я пытался внедрить ZXing (XZing), пока не обнаружил Zbar. У них более простой способ встраивания, меньше кода и простые примеры.

http://sourceforge.net/projects/zbar/

person aslakjo    schedule 28.02.2013
comment
ZBar не обновлялся больше года. - person CodyBugstein; 07.10.2014
comment
ZBar не обновлялся с февраля 2013 года. - person Dan Dascalescu; 11.08.2016