Интеграция библиотеки ZXing непосредственно в приложение для Android

Я пишу это в простом отчаянии 🙂 Мне поручили сделать автономный сканер штрих-кода (как доказательство концепции) на Android 1.6.

Для этого я открыл библиотеку ZXing.

Я googled, читаю связанные темы здесь, когда StackOverflow использовал общий смысл и так далее. Кажется, ничего не помогло, и я просто не могу пробить дыру в этой ментальной блокаде: /

Я знаю, что это возможно, использовать lib и создать собственный автономный сканер штрих-кода. Я читал, что использование «сканера штрих-кода», предоставленного людьми Zxing, на сегодняшний день является самым простым решением (через Intent). К сожалению, это не вариант, и требуется отдельное приложение.

Итак, чтобы подвести итог моей проблеме:

  1. Как интегрировать исходный код ZXing в проект Android Code через Eclipse?
  2. Когда интегрировано … как использовать lib, «загружать» функцию сканирования?
  3. Пошаговое руководство почти предпочтительнее, потому что я только начал работать в Eclipse.

Я попытался сделать свой проект кода зависимым от папки Android из исходной папки ZXing. Когда я это делаю, возникают мелкие ошибки, в основном касающиеся «org.apache» (??)

Я просто не могу понять … так что несколько советов были бы наиболее полезными.

Заранее благодарю вас 🙂

ОБНОВИТЬ! – РЕШЕНИЕ + РУКОВОДСТВО

Мне удалось разобраться в этом 🙂 И внизу вы можете прочитать пошаговое руководство, чтобы он, надеюсь, мог помочь другим с той же проблемой, что и у меня;)

  1. Установите Apache Ant – ( см. Это видео YouTube для справки конфигурации )
  2. Загрузите источник ZXing с домашней страницы ZXing и извлеките его
  3. С помощью командной строки Windows (Run-> CMD) перейдите в корневой каталог загруженного zxing src .
  4. В окне командной строки – введите ant -f core/build.xml нажмите enter и пусть Apache работает, это волшебство [ есть проблемы? ]
  5. Введите Eclipse -> новый проект Android, основанный на папке android в только что извлеченном каталоге
  6. Щелкните правой кнопкой мыши папку проекта -> Свойства -> Путь сборки Java -> Библиотека -> Добавить внешние JAR …
  7. Перейдите к недавно извлеченной папке и откройте основной каталог и выберите core.jar … нажмите enter!

Теперь вам нужно исправить несколько ошибок в переводах и файл AndroidManifest.xml 🙂 Теперь вы можете с радостью скомпилировать, и теперь у вас будет автономное приложение для сканирования штрих-кодов на основе источника ZXing;)

Счастливые кодирующие парни – надеюсь, это может помочь другим 🙂

Ниже приводится пошаговое руководство по созданию и отображению QR-кода с использованием библиотеки ZXing без необходимости установки стороннего приложения. Примечание: вам не нужно создавать ZXing с ANT или любым другим инструментом сборки. Файл core.jar доступен в выпущенном zip-архиве (см. Ниже).

  1. Загрузите последнюю версию ZXing . – ( ZXing-*.zip )
  2. Извлеките этот zip-архив и найдите core.jar core/ .
  3. Если вы используете Eclipse IDE, перетащите core.jar в каталог libs вашего проекта Android. Когда его спросят, выберите Копировать .
  4. Скопируйте два classа, приведенные ниже ( Contents.java & QRCodeEncoder.java ) в основной пакет вашего Android-проекта.
  5. Создайте элемент ImageView в своей деятельности, чтобы отобразить сгенерированный QR-код, если у вас его еще нет. Пример приведен ниже:
  6. Используйте fragment кода ниже, чтобы сгенерировать QR-код в формате Bitmap и отобразить его в ImageView .

Вот элемент ImageView для добавления в XML-файл макета Activity:

  

Фрагмент кода:

 // ImageView to display the QR code in. This should be defined in // your Activity's XML layout file ImageView imageView = (ImageView) findViewById(R.id.qrCode); String qrData = "Data I want to encode in QR code"; int qrCodeDimention = 500; QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null, Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimention); try { Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); imageView.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } 

Здесь находится Contents.java

 // // * Copyright (C) 2008 ZXing authors // * // * Licensed under the Apache License, Version 2.0 (the "License"); // * you may not use this file except in compliance with the License. // * You may obtain a copy of the License at // * // * http://www.apache.org/licenses/LICENSE-2.0 // * // * Unless required by applicable law or agreed to in writing, software // * distributed under the License is distributed on an "AS IS" BASIS, // * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // * See the License for the specific language governing permissions and // * limitations under the License. // import android.provider.ContactsContract; public final class Contents { private Contents() { } public static final class Type { // Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string // must include "http://" or "https://". public static final String TEXT = "TEXT_TYPE"; // An email type. Use Intent.putExtra(DATA, string) where string is the email address. public static final String EMAIL = "EMAIL_TYPE"; // Use Intent.putExtra(DATA, string) where string is the phone number to call. public static final String PHONE = "PHONE_TYPE"; // An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS. public static final String SMS = "SMS_TYPE"; public static final String CONTACT = "CONTACT_TYPE"; public static final String LOCATION = "LOCATION_TYPE"; private Type() { } } public static final String URL_KEY = "URL_KEY"; public static final String NOTE_KEY = "NOTE_KEY"; // When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple phone numbers and addresses. public static final String[] PHONE_KEYS = { ContactsContract.Intents.Insert.PHONE, ContactsContract.Intents.Insert.SECONDARY_PHONE, ContactsContract.Intents.Insert.TERTIARY_PHONE }; public static final String[] PHONE_TYPE_KEYS = { ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE }; public static final String[] EMAIL_KEYS = { ContactsContract.Intents.Insert.EMAIL, ContactsContract.Intents.Insert.SECONDARY_EMAIL, ContactsContract.Intents.Insert.TERTIARY_EMAIL }; public static final String[] EMAIL_TYPE_KEYS = { ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE, ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE }; } 

И QRCodeEncoder.java

 /* * Copyright (C) 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.provider.ContactsContract; import android.graphics.Bitmap; import android.os.Bundle; import android.telephony.PhoneNumberUtils; import java.util.Collection; import java.util.EnumMap; import java.util.HashSet; import java.util.Map; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; public final class QRCodeEncoder { private static final int WHITE = 0xFFFFFFFF; private static final int BLACK = 0xFF000000; private int dimension = Integer.MIN_VALUE; private String contents = null; private String displayContents = null; private String title = null; private BarcodeFormat format = null; private boolean encoded = false; public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) { this.dimension = dimension; encoded = encodeContents(data, bundle, type, format); } public String getContents() { return contents; } public String getDisplayContents() { return displayContents; } public String getTitle() { return title; } private boolean encodeContents(String data, Bundle bundle, String type, String formatString) { // Default to QR_CODE if no format given. format = null; if (formatString != null) { try { format = BarcodeFormat.valueOf(formatString); } catch (IllegalArgumentException iae) { // Ignore it then } } if (format == null || format == BarcodeFormat.QR_CODE) { this.format = BarcodeFormat.QR_CODE; encodeQRCodeContents(data, bundle, type); } else if (data != null && data.length() > 0) { contents = data; displayContents = data; title = "Text"; } return contents != null && contents.length() > 0; } private void encodeQRCodeContents(String data, Bundle bundle, String type) { if (type.equals(Contents.Type.TEXT)) { if (data != null && data.length() > 0) { contents = data; displayContents = data; title = "Text"; } } else if (type.equals(Contents.Type.EMAIL)) { data = trim(data); if (data != null) { contents = "mailto:" + data; displayContents = data; title = "E-Mail"; } } else if (type.equals(Contents.Type.PHONE)) { data = trim(data); if (data != null) { contents = "tel:" + data; displayContents = PhoneNumberUtils.formatNumber(data); title = "Phone"; } } else if (type.equals(Contents.Type.SMS)) { data = trim(data); if (data != null) { contents = "sms:" + data; displayContents = PhoneNumberUtils.formatNumber(data); title = "SMS"; } } else if (type.equals(Contents.Type.CONTACT)) { if (bundle != null) { StringBuilder newContents = new StringBuilder(100); StringBuilder newDisplayContents = new StringBuilder(100); newContents.append("MECARD:"); String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME)); if (name != null) { newContents.append("N:").append(escapeMECARD(name)).append(';'); newDisplayContents.append(name); } String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL)); if (address != null) { newContents.append("ADR:").append(escapeMECARD(address)).append(';'); newDisplayContents.append('\n').append(address); } Collection uniquePhones = new HashSet(Contents.PHONE_KEYS.length); for (int x = 0; x < Contents.PHONE_KEYS.length; x++) { String phone = trim(bundle.getString(Contents.PHONE_KEYS[x])); if (phone != null) { uniquePhones.add(phone); } } for (String phone : uniquePhones) { newContents.append("TEL:").append(escapeMECARD(phone)).append(';'); newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); } Collection uniqueEmails = new HashSet(Contents.EMAIL_KEYS.length); for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) { String email = trim(bundle.getString(Contents.EMAIL_KEYS[x])); if (email != null) { uniqueEmails.add(email); } } for (String email : uniqueEmails) { newContents.append("EMAIL:").append(escapeMECARD(email)).append(';'); newDisplayContents.append('\n').append(email); } String url = trim(bundle.getString(Contents.URL_KEY)); if (url != null) { // escapeMECARD(url) -> wrong escape eg http\://zxing.google.com newContents.append("URL:").append(url).append(';'); newDisplayContents.append('\n').append(url); } String note = trim(bundle.getString(Contents.NOTE_KEY)); if (note != null) { newContents.append("NOTE:").append(escapeMECARD(note)).append(';'); newDisplayContents.append('\n').append(note); } // Make sure we've encoded at least one field. if (newDisplayContents.length() > 0) { newContents.append(';'); contents = newContents.toString(); displayContents = newDisplayContents.toString(); title = "Contact"; } else { contents = null; displayContents = null; } } } else if (type.equals(Contents.Type.LOCATION)) { if (bundle != null) { // These must use Bundle.getFloat(), not getDouble(), it's part of the API. float latitude = bundle.getFloat("LAT", Float.MAX_VALUE); float longitude = bundle.getFloat("LONG", Float.MAX_VALUE); if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) { contents = "geo:" + latitude + ',' + longitude; displayContents = latitude + "," + longitude; title = "Location"; } } } } public Bitmap encodeAsBitmap() throws WriterException { if (!encoded) return null; Map hints = null; String encoding = guessAppropriateEncoding(contents); if (encoding != null) { hints = new EnumMap(EncodeHintType.class); hints.put(EncodeHintType.CHARACTER_SET, encoding); } MultiFormatWriter writer = new MultiFormatWriter(); BitMatrix result = writer.encode(contents, format, dimension, dimension, hints); int width = result.getWidth(); int height = result.getHeight(); int[] pixels = new int[width * height]; // All are 0, or black, by default for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } private static String guessAppropriateEncoding(CharSequence contents) { // Very crude at the moment for (int i = 0; i < contents.length(); i++) { if (contents.charAt(i) > 0xFF) { return "UTF-8"; } } return null; } private static String trim(String s) { if (s == null) { return null; } String result = s.trim(); return result.length() == 0 ? null : result; } private static String escapeMECARD(String input) { if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; } int length = input.length(); StringBuilder result = new StringBuilder(length); for (int i = 0; i < length; i++) { char c = input.charAt(i); if (c == ':' || c == ';') { result.append('\\'); } result.append(c); } return result.toString(); } } - /* * Copyright (C) 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.provider.ContactsContract; import android.graphics.Bitmap; import android.os.Bundle; import android.telephony.PhoneNumberUtils; import java.util.Collection; import java.util.EnumMap; import java.util.HashSet; import java.util.Map; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; public final class QRCodeEncoder { private static final int WHITE = 0xFFFFFFFF; private static final int BLACK = 0xFF000000; private int dimension = Integer.MIN_VALUE; private String contents = null; private String displayContents = null; private String title = null; private BarcodeFormat format = null; private boolean encoded = false; public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) { this.dimension = dimension; encoded = encodeContents(data, bundle, type, format); } public String getContents() { return contents; } public String getDisplayContents() { return displayContents; } public String getTitle() { return title; } private boolean encodeContents(String data, Bundle bundle, String type, String formatString) { // Default to QR_CODE if no format given. format = null; if (formatString != null) { try { format = BarcodeFormat.valueOf(formatString); } catch (IllegalArgumentException iae) { // Ignore it then } } if (format == null || format == BarcodeFormat.QR_CODE) { this.format = BarcodeFormat.QR_CODE; encodeQRCodeContents(data, bundle, type); } else if (data != null && data.length() > 0) { contents = data; displayContents = data; title = "Text"; } return contents != null && contents.length() > 0; } private void encodeQRCodeContents(String data, Bundle bundle, String type) { if (type.equals(Contents.Type.TEXT)) { if (data != null && data.length() > 0) { contents = data; displayContents = data; title = "Text"; } } else if (type.equals(Contents.Type.EMAIL)) { data = trim(data); if (data != null) { contents = "mailto:" + data; displayContents = data; title = "E-Mail"; } } else if (type.equals(Contents.Type.PHONE)) { data = trim(data); if (data != null) { contents = "tel:" + data; displayContents = PhoneNumberUtils.formatNumber(data); title = "Phone"; } } else if (type.equals(Contents.Type.SMS)) { data = trim(data); if (data != null) { contents = "sms:" + data; displayContents = PhoneNumberUtils.formatNumber(data); title = "SMS"; } } else if (type.equals(Contents.Type.CONTACT)) { if (bundle != null) { StringBuilder newContents = new StringBuilder(100); StringBuilder newDisplayContents = new StringBuilder(100); newContents.append("MECARD:"); String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME)); if (name != null) { newContents.append("N:").append(escapeMECARD(name)).append(';'); newDisplayContents.append(name); } String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL)); if (address != null) { newContents.append("ADR:").append(escapeMECARD(address)).append(';'); newDisplayContents.append('\n').append(address); } Collection uniquePhones = new HashSet(Contents.PHONE_KEYS.length); for (int x = 0; x < Contents.PHONE_KEYS.length; x++) { String phone = trim(bundle.getString(Contents.PHONE_KEYS[x])); if (phone != null) { uniquePhones.add(phone); } } for (String phone : uniquePhones) { newContents.append("TEL:").append(escapeMECARD(phone)).append(';'); newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); } Collection uniqueEmails = new HashSet(Contents.EMAIL_KEYS.length); for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) { String email = trim(bundle.getString(Contents.EMAIL_KEYS[x])); if (email != null) { uniqueEmails.add(email); } } for (String email : uniqueEmails) { newContents.append("EMAIL:").append(escapeMECARD(email)).append(';'); newDisplayContents.append('\n').append(email); } String url = trim(bundle.getString(Contents.URL_KEY)); if (url != null) { // escapeMECARD(url) -> wrong escape eg http\://zxing.google.com newContents.append("URL:").append(url).append(';'); newDisplayContents.append('\n').append(url); } String note = trim(bundle.getString(Contents.NOTE_KEY)); if (note != null) { newContents.append("NOTE:").append(escapeMECARD(note)).append(';'); newDisplayContents.append('\n').append(note); } // Make sure we've encoded at least one field. if (newDisplayContents.length() > 0) { newContents.append(';'); contents = newContents.toString(); displayContents = newDisplayContents.toString(); title = "Contact"; } else { contents = null; displayContents = null; } } } else if (type.equals(Contents.Type.LOCATION)) { if (bundle != null) { // These must use Bundle.getFloat(), not getDouble(), it's part of the API. float latitude = bundle.getFloat("LAT", Float.MAX_VALUE); float longitude = bundle.getFloat("LONG", Float.MAX_VALUE); if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) { contents = "geo:" + latitude + ',' + longitude; displayContents = latitude + "," + longitude; title = "Location"; } } } } public Bitmap encodeAsBitmap() throws WriterException { if (!encoded) return null; Map hints = null; String encoding = guessAppropriateEncoding(contents); if (encoding != null) { hints = new EnumMap(EncodeHintType.class); hints.put(EncodeHintType.CHARACTER_SET, encoding); } MultiFormatWriter writer = new MultiFormatWriter(); BitMatrix result = writer.encode(contents, format, dimension, dimension, hints); int width = result.getWidth(); int height = result.getHeight(); int[] pixels = new int[width * height]; // All are 0, or black, by default for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } private static String guessAppropriateEncoding(CharSequence contents) { // Very crude at the moment for (int i = 0; i < contents.length(); i++) { if (contents.charAt(i) > 0xFF) { return "UTF-8"; } } return null; } private static String trim(String s) { if (s == null) { return null; } String result = s.trim(); return result.length() == 0 ? null : result; } private static String escapeMECARD(String input) { if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; } int length = input.length(); StringBuilder result = new StringBuilder(length); for (int i = 0; i < length; i++) { char c = input.charAt(i); if (c == ':' || c == ';') { result.append('\\'); } result.append(c); } return result.toString(); } } 

 compile 'com.google.zxing:core:2.3.0' 

к сожалению, не работает для меня.

Это то, что сработало для меня:

 dependencies { compile 'com.journeyapps:zxing-android-embedded:[email protected]' compile 'com.google.zxing:core:3.2.0' } 

Перейдите по ссылке: https://github.com/journeyapps/zxing-android-embedded

Возникли проблемы с ANT? Продолжай читать

Если ant -f core/build.xml говорит что-то вроде:

 Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar 

затем установите переменную среды JAVA_HOME в соответствующую папку java. Я нашел tools.jar в моей (для Windows):

 C:\Program Files\Java\jdk1.6.0_21\lib 

поэтому я установил свой JAVA_HOME :

 C:\Progra~1\Java\jdk1.6.0_25 

причина для более короткого синтаксиса, который я нашел на каком-то сайте, который гласит:

«Настоятельно рекомендуется выбрать каталог установки, который не включает пробелы в имени пути (например, НЕ устанавливать в C: \ Program Files). Если Java установлен в таком каталоге, крайне важно установить JAVA_HOME переменная среды к пути, который не включает пробелы (например, C: \ Progra ~ 1), отказ от этого приведет к исключениям, которые могут быть выбраны некоторыми программами, зависящими от значения JAVA_HOME. ”

Затем я перезапустил cmd (важно, потому что shell DOS только запускает env vars при запуске, поэтому изменение env var потребует использования новой оболочки для получения обновленного значения)

и наконец работал ant -f core/build.xml .

Поскольку некоторые из ответов устарели, я хотел бы предоставить свои собственные –

Чтобы интегрировать библиотеку ZXing в ваше приложение Android, как предложено их Wiki , вам необходимо добавить в проект два файла Java:

  • IntentIntegrator.java
  • IntentResult.java

Затем в Android Studio добавьте следующую строку для файла build.gradle :

 dependencies { .... compile 'com.google.zxing:core:3.2.1' } 

Или если по-прежнему использовать Eclipse с ADT-plugin, добавьте файл core.jar в подкаталог libs вашего проекта (здесь полноэкранный Windows и полноэкранный Mac ):

Снимок экрана Windows

Наконец, добавьте этот код в свой MainActivity.java :

 public void scanQRCode(View v) { IntentIntegrator integrator = new IntentIntegrator(MainActivity.this); integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (result != null) { String contents = result.getContents(); if (contents != null) { showDialog(R.string.result_succeeded, result.toString()); } else { showDialog(R.string.result_failed, getString(R.string.result_failed_why)); } } } private void showDialog(int title, CharSequence message) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title); builder.setMessage(message); builder.setPositiveButton(R.string.ok_button, null); builder.show(); } 

В результате приложение попросит установить и запустить приложение сканера штрих-кода ZXing (которое автоматически вернется к вашему приложению после сканирования):

Приложение для сканера штрих-кодов

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

Приложение ZXing Test

Затем вам нужно 4 файла Java из GitHub :

  • BenchmarkActivity.java
  • BenchmarkAsyncTask.java
  • BenchmarkItem.java
  • ZXingTestActivity.java

И 3 файла Jar из репозитория Maven :

  • core.jar
  • Android-core.jar
  • Android-integration.jar

(Вы можете сами создавать файлы Jar с помощью mvn package – если вы проверите ZXing из GitHub и установите средства ant и maven на свой компьютер).

Примечание. Если ваш проект не распознает файлы Jar, вам может потребоваться обновить версию Java в свойствах проекта:

скриншот свойств

Вы видели страницы wiki на веб-сайте zxing? Кажется, вы могли бы найти GettingStarted , DeveloperNotes и ScanningViaIntent .

Положил

 compile 'com.google.zxing:core:2.3.0' 

в ваши зависимости от Gradle. Так просто. До использования системы Android Studio и Gradle.

Если вам просто нужен core.jar из zxing, вы можете пропустить этот процесс и получить готовые JAR- файлы с вики-страницы GettingStarted

В последнем ZXing (2.2) нет core.jar в основной папке, но вы можете получить core.jar из репозитория zxing Maven здесь

Шаг за шагом, чтобы установить zxing 3.2.1 в eclipse

  1. Загрузите zxing-master.zip с ” https://github.com/zxing/zxing
  2. Unzip zxing-master.zip, использовать eclipse для импорта проекта «android» в zxing-master
  3. Загрузите core-3.2.1.jar с ” http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  4. Создайте папку «libs» в проекте «android» и вставьте cor-3.2.1.jar в папку libs
  5. Нажмите на проект: выберите «свойства» -> «Компилятор Java», чтобы изменить уровень до 1.7. Затем нажмите на «Android» изменить «Project build target» на Android 4.4.2+, так как использование 1.7 требует компиляции с Android 4.4
  6. Если «CameraConfigurationUtils.java» не существует в «zxing-master / android / app / src / main / java / com / google / zxing / client / android / camera /». Вы можете скопировать его из «zxing-master / android-core / src / main / java / com / google / zxing / client / android / camera /» и вставить в свой проект.
  7. Очистить и построить проект. Если в вашем проекте отображается ошибка «switch-case», вы должны изменить их на «if-else».
  8. Завершено. Очистить и построить проект.
  9. Ссылка ссылки: использование ZXing для создания приложения для сканирования штрих-кода для Android

Я пробовал все возможные способы достижения этой цели, а затем я открыл Minified версию xZing от JourneyApps. Я портировал это для eclipse и поделился с GitHub.

Если вы используете eclipse, используйте этот проект: –

https://github.com/hiteshsahu/XZing-Barcode-Scanner-Minified-Eclipse

Если вы используете Studio, используйте этот проект: –

https://github.com/journeyapps/zxing-android-embedded

преимущества

  1. Встроенный сканер штрих-кода в вашем приложении не требуется устанавливать сторонние приложения с помощью playstore.

  2. Вам не нужно путаться между kernelм, Android-клиентом и т. Д., Просто удалите эти пакеты и релевантные макеты в вашем проекте, и вам хорошо идти. Только Jar требуется com.google.zxing: core: 3.2.0, который вы можете скачать из

    http://mvnrepository.com/artifact/com.google.zxing/core/3.2.0

  3. Не нужно добавлять тонны пакетов, см. Изображения ниже для сравнения

До :-

введите описание изображения здесь

После :-

введите описание изображения здесь

  1. Самая важная часть – они очень настраиваемые, т.е. вы можете добавить вспышку, использовать ее в fragmentе и изменить ориентацию ориентации.

  2. Вы можете использовать эту активность Capture в приложении Cordova для сканирования штрих-кодов.

ваша активность захвата в манифесте приложения будет выглядеть так:

        

и плагин будет выглядеть так

 public class BarcodeScanner extends CordovaPlugin { public static final int REQUEST_CODE = 0x0ba7c0de; private static final String SCAN = "scan"; private static final String CANCELLED = "cancelled"; private static final String FORMAT = "format"; private static final String TEXT = "text"; private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN"; private static final String LOG_TAG = "BarcodeScanner"; private CallbackContext callbackContext; /** * Constructor. */ public BarcodeScanner() { } /** * Executes the request. * * This method is called from the WebView thread. To do a non-trivial amount of work, use: * cordova.getThreadPool().execute(runnable); * * To run on the UI thread, use: * cordova.getActivity().runOnUiThread(runnable); * * @param action The action to execute. * @param args The exec() arguments. * @param callbackContext The callback context used when calling back into JavaScript. * @return Whether the action was valid. * * @sa https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/CordovaPlugin.java */ @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { this.callbackContext = callbackContext; if (action.equals(SCAN)) { scan(args); } else { return false; } return true; } /** * Starts an intent to scan and decode a barcode. */ public void scan(JSONArray args) { Intent intentScan = new Intent(SCAN_INTENT); intentScan.addCategory(Intent.CATEGORY_DEFAULT); // add config as intent extras if(args.length() > 0) { JSONObject obj; JSONArray names; String key; Object value; for(int i=0; i 

Счастливая интеграция!

Ребятам из zxing было проще создать проект Android с 1.7. Это не так больно, как раньше. Это быстрый блог для тех, кто хотел бы быстро создать проект zxing для Android.

  • Оформить заказ источников zxing от zxing.org
  • Создайте проект Android на своем затмении
  • Удалить main.xml
  • Щелкните правой кнопкой мыши по каталогу «src» и нажмите «Импорт». Перейдите в следующие каталоги в указанном порядке. Когда вы добавляете их для импорта по одному, убедитесь, что у вас есть каталог src в поле редактирования мастера импорта. И вы выбираете только каталог «com» ​​в левом дереве каталогов. Не выбирайте src.
  • kernel
  • Android-интеграция
  • андроид
  • Убедитесь, что ваша версия Android sdk равна 9, что-то меньшее, и androidmanifest.xml будет плакать.
  • Strings.xml на одном из языков будет crib, просто поместите a / before ‘character

Проект Android для zxing 1.7 (20 июня).

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( НЕ ДОСТУПНО ЛЮБОЙ )

Зачем использовать внешнюю библиотеку, когда сервисы google play (начиная с версии 7.8.0 ) include в себя декодер штрих-кода.

Намного проще.

Просто укажите зависимость в вашем файле уровня gradleиента уровня приложения

 compile 'com.journeyapps:zxing-android-embedded:[email protected]' compile 'com.google.zxing:core:3.2.0' 

Определите одну кнопку в вашем XML-файле и напишите ниже код в файле Java в OnCreate () и внутри прослушивателя OnClick

 new IntentIntegrator(this).initiateScan(); 

И напишите ниже код после OnCreate () файла Java

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if(result != null) { if(result.getContents() == null) { Log.d("MainActivity", "Cancelled scan"); Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show(); } else { Log.d("MainActivity", "Scanned"); st_scanned_result = result.getContents(); Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show(); } } } 

Недавно я использовал Google для мобильных устройств как для iOS, так и для Android. Я настоятельно рекомендую использовать Google Barcode Scan. Он очень отзывчив с любой ориентацией и временем обработки довольно быстро. Он называется Google Mobile Vision.

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

https://developers.google.com/vision/

https://codelabs.developers.google.com/codelabs/bar-codes/#0

Я просто написал метод, который декодирует созданные штрих-коды, Bitmap to String .

Он выполняет именно то, что запрашивается, только без CaptureActivity

Таким образом, можно пропустить библиотеку android-integration в build.gradle :

 dependencies { // https://mvnrepository.com/artifact/com.google.zxing compile('com.google.zxing:core:3.3.0') compile('com.google.zxing:android-core:3.3.0') } 

Следующий метод (который фактически декодирует созданные штрих-коды в рамках теста jUnit):

 import android.graphics.Bitmap; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.RGBLuminanceSource; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.Result; protected String decode(Bitmap bitmap) { MultiFormatReader reader = new MultiFormatReader(); String barcode = null; int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()]; bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray); BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source)); try { Result result = reader.decode(binary); // BarcodeFormat format = result.getBarcodeFormat(); // ResultPoint[] points = result.getResultPoints(); // byte[] bytes = result.getRawBytes(); barcode = result.getText(); } catch (NotFoundException e) { e.printStackTrace(); } return barcode; } 
Давайте будем гением компьютера.