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

143

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

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

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

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

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

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

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

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

Заранее спасибо :)

AppDev
источник
Я считаю, что то, что вы хотели сделать, можно найти здесь: stackoverflow.com/questions/4854442/…
Дэнни Ремингтон - OMS
ZXing - не единственный способ считывания штрих-кода. С 2016 года стало намного проще использовать Android Barcode API .
Дэн Даскалеску

Ответы:

127

ОБНОВИТЬ! - РЕШЕНО + ГИД

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

  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;)

Счастливых программистов - надеюсь, это поможет другим :)

AppDev
источник
Отличное описание! Не могли бы вы добавить некоторые подробности того, что вы редактировали в AndroidManifest.xmlфайле? При проверке я не вижу ошибок в этом файле. Благодарность!
Брайан Армстронг,
7
Ошибок в файле AndroidManifest.xml и переводах нет. Однако в последней версии Android SDK есть проблемы с совместимостью. Если вы его используете, вам придется использовать более поздний исходный код из SVN.
Шон Оуэн,
Привет, я пытался разработать другое приложение для сканирования QR-кодов как отдельное приложение без использования каких-либо приложений QR Droid или Barcode Scanner. Упомянутые вами шаги именно для этого или вы все еще используете какое-то другое приложение с помощью намерений или чего-то еще?
kumar
1
Пакет zip из code.google.com/p/zxing/downloads/list содержит каталог "core", а также "android" и "android-integration". По какой причине вы использовали «ядро»?
Michał K
1
Хорошо, теперь я знаю почему. Если кому-то интересно, см. Stackoverflow.com/questions/4854442/…
Михал К.
83

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

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

Вот ImageViewэлемент, который нужно добавить в XML-файл макета Activity:

<ImageView 
    android:id="@+id/qrCode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp"
    android:layout_centerHorizontal="true"/>

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

// 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<String> uniquePhones = new HashSet<String>(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<String> uniqueEmails = new HashSet<String>(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 e.g. 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<EncodeHintType, Object> hints = null;
        String encoding = guessAppropriateEncoding(contents);
        if (encoding != null) {
            hints = new EnumMap<EncodeHintType, Object>(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();
    }
}
Весам
источник
13
В последней версии ZXing по какой-то причине нет core.jar. Пришлось для этого скачать 2.1.
capcom
12
core.jar отдельно доступен в репозитории выпуска Maven, для версии 2.2 ссылка: repo1.maven.org/maven2/com/google/zxing/core/2.2/core-2.2.jar
Nantoka
12
Zxing 2.3.0 core.jar здесь: repo1.maven.org/maven2/com/google/zxing/core/2.3.0
Руи Маркес
1
Ваш метод encodeAsBitmap () возвращает значение null, если оно не было изменено, или завершается ошибкой с исключением NullPointerException, если я закомментировал строку, возвращающую значение null. Я новичок в этой библиотеке. Что я делаю не так?
KG6ZVP
2
@ Весам, это было действительно полезно. Но можете ли вы также предоставить код, где можно сделать обратное. Я имею в виду, преобразовать QR-код обратно в строку?
Шаон Хасан
15

В

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

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

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

dependencies {
   compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
   compile 'com.google.zxing:core:3.2.0'
}

Найдите ссылку здесь: https://github.com/journeyapps/zxing-android-embedded

Кароли
источник
1
Этот ответ затмевается другими ответами здесь. Большинство со снимками экрана и прочим. Жаль, потому что это единственный ответ, который действительно работает! Обратите внимание на это. Он не упомянул, что связанный проект - это ветка, в которой кто-то превратил эту сложную библиотеку в простую (и на самом деле простую) в использовании библиотеку. Просто скачайте core jar из обычного проекта ZXING, и все готово. Даже есть примеры !!!!
StarWind0
1
Хотел бы я дать больше голосов. Вы не представляете, сколько раз я пытался выяснить это в разных проектах за эти годы.
StarWind0
1
Я рад служить ребятам :)
Karoly
11

Возникли проблемы при сборке с помощью 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 (важно, потому что оболочка DOS читает только переменные env при запуске, поэтому изменение env var потребует от вас использовать новую оболочку для получения обновленного значения)

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

Даниколай
источник
11

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

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

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

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

Или, если вы все еще используете Eclipse с ADT-плагином, добавьте файл 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();
}

Получившееся приложение попросит установить и запустить приложение Barcode Scanner от 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 в свойствах проекта:

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

Александр Фарбер
источник
2
Это фантастический ответ!
Пареш Майани 01
3
Боюсь, это упускает суть вопроса :-( Дело было в том, чтобы не полагаться на внешнее приложение. Это показывает, как .. использовать внешнее приложение? См. Заголовок вопроса "прямо в"
StarWind0
5

Ставить

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

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

Кевин Тан
источник
Правильно! Это реальное решение в 2015 году. Кстати. текущая версия - 3.2.0
funcoder 06
это сработало для кого-нибудь? IntentIntegrator по-прежнему не может быть найден
Karoly
Вам следует вручную скопировать файлы IntentIntegrator.java и IntentResult.java в свой проект Android Studio.
Александр Фарбер
4

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

Скотт В.
источник
Извините ... это была не совсем та помощь, которую я искал :) Но сегодня у меня был прорыв: мне удалось выяснить это самостоятельно;) Руководство для других зрителей с той же проблемой будет опубликовано в мгновение ока :)
AppDev
2

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

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

Хосу Гарсия де Альбизу
источник
2

Пошаговая настройка zxing 3.2.1 в eclipse

  1. Скачать zxing-master.zip от « https://github.com/zxing/zxing »
  2. Разархивируйте 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
Ань Дуй
источник
2

Я перепробовал все возможные способы добиться этого, а затем обнаружил миниатюрную версию 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. Вам не нужно путаться между банками Core, Android client и т. Д., Просто отбросьте эти пакеты и соответствующие макеты в свой проект, и все готово. Требуется только Jar - com.google.zxing: core: 3.2.0, который можно загрузить с

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

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

Перед :-

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

После :-

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

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

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

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

  <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:clearTaskOnLaunch="true"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:screenOrientation="fullSensor"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:windowSoftInputMode="stateAlwaysHidden" >
            <intent-filter>
                <action android:name="com.google.zxing.client.android.SCAN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

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

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<args.length(); i++) {

                try {
                    obj = args.getJSONObject(i);
                } catch(JSONException e) {
                    Log.i("CordovaLog", e.getLocalizedMessage());
                    continue;
                }

                names = obj.names();
                for(int j=0; j<names.length(); j++) {
                    try {
                        key = names.getString(j);
                        value = obj.get(key);

                        if(value instanceof Integer) {
                            intentScan.putExtra(key, (Integer)value);
                        } else if(value instanceof String) {
                            intentScan.putExtra(key, (String)value);
                        }

                    } catch(JSONException e) {
                        Log.i("CordovaLog", e.getLocalizedMessage());
                        continue;
                    }
                }
            }

        }

        // avoid calling other phonegap apps
        intentScan.setPackage(this.cordova.getActivity().getApplicationContext().getPackageName());

        this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, REQUEST_CODE);
    }

    /**
     * Called when the barcode scanner intent completes.
     *
     * @param requestCode The request code originally supplied to startActivityForResult(),
     *                       allowing you to identify who this result came from.
     * @param resultCode  The integer result code returned by the child activity through its setResult().
     * @param intent      An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                JSONObject obj = new JSONObject();
                try {
                    obj.put(TEXT, intent.getStringExtra("SCAN_RESULT"));
                    obj.put(FORMAT, intent.getStringExtra("SCAN_RESULT_FORMAT"));
                    obj.put(CANCELLED, false);
                } catch (JSONException e) {
                    Log.d(LOG_TAG, "JSONException "+e.getMessage());
                }
                this.callbackContext.success(obj);
            } else if (resultCode == Activity.RESULT_CANCELED) {
                this.callbackContext.success("");
            } else {
                this.callbackContext.error("Technical Problem");
            }
        }
    }
}

Удачной интеграции !!

Хитеш Саху
источник
2

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

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

Android-проект для zxing 1.7 (расчет 20 июня).

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

Сиддхартх
источник
2

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

пеллюцид
источник
1
Вы не можете установить сервисы Google Play в Китае, потому что Google заблокирован.
Xiè Jìléi
Если у вас, к счастью, установлены сервисы Google Play, вы все равно не сможете использовать их в Китае, потому что Google заблокирован.
Xiè Jìléi
2

Я просто написал метод, который декодирует сгенерированные штрих-коды Bitmapв 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;
}
Мартин Цайтлер
источник
1

ОБНОВЛЕНИЕ 2020: просто добавьте это в свой файл Gradle. Работает отлично!

repositories {
   jcenter()
}
implementation 'me.dm7.barcodescanner:zxing:1.9.13'
Мано Харан
источник
0

Недавно я использовал мобильное зрение Google как на ios, так и на android. Я настоятельно рекомендую использовать Google Barcode Scan. Он довольно быстро реагирует на любую ориентацию, и время обработки довольно быстрое. Это называется Google Mobile Vision.

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

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

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

Касильяс
источник
0

Намного более простой подход.

Просто включите зависимость в файл градиента уровня приложения

compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
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");
            String st_scanned_result = result.getContents();
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

        }
    }

}
Тара
источник
st_scanned_resultздесь не определено
келалака
Это глобальная переменная типа String. Если вы не используете отсканированный результат вне этого onActivtyResult (), вы можете определить его локально. Как String st_scanned_result = result.getContents (); Я его обновил плз чк.
Тара