Внедрение библиотеки 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/