Внедрение библиотеки Zxing без использования приложения Сканер штрих-кодов

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

Ответ 1

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

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

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

Ответ 2

Android QR/Barcode/Multiformat Decoder.

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

Вот шаги:

  • Во-первых, я создал версию AVD (эмулятор) 4 в своей Eclipse IDE с включенной SD-картой и функциями камеры.

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

    c:\>mksdcard 40M mysdcard.iso
    

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

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

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

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

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

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

    c:\>adb push "c:\myqrcode.png" /sdcard
    
  • Затем в 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);
    
        }
    
    }
    
  • Затем я загрузил исходный код ZXing (ZXing-1.6.zip) из приведенной ниже ссылки.

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

Затем извлеките это и перейдите к D:\zxing-1.6\core\src\com

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

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

  • Затем скопируйте и вставьте указанный ниже код в файл 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>
    
  • Затем скопируйте и вставьте приведенный ниже код в файл 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>
    
  • Затем скопируйте и вставьте указанный ниже код в файл 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>
    
  • Затем скопируйте и вставьте указанный ниже код в файл манифеста после тега открытия

    <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" />      
    
  • Итак, эти вышеописанные шаги... наше приложение готово. Теперь вы можете запустить приложение, и оно даст декодированный результат входного изображения, которое мы дали.

  • Чтобы изменить ввод, нажмите другой файл на 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 и мобильных приложений и сожалею о любых ошибках, которые я мог бы сделать...

Ответ 3

Если вы следуете за ответом Palani и хотите импортировать ядро ​​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();
}

Ответ 4

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

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

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

  • 1D штрих-коды: 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 и т.д.)
  • Событие календаря
  • Email
  • Телефон
  • SMS
  • ISBN
  • WiFi
  • Геопозиционирование (широта и долгота)
  • Лицензия/идентификатор драйвера AAMVA

Ответ 5

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

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

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

  • Если вы добавляете библиотеку 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

Ответ 6

https://github.com/dm77/barcodescanner

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

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

Ответ 7

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

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