Я пишу это в полном отчаянии :) Мне поручили сделать автономный сканер штрих-кода (в качестве доказательства концепции) для телефона Android 1.6.
Для этого я открыл для себя библиотеку ZXing.
Я гуглил, читал связанные темы здесь, в StackOverflow, использовал общий смысл и так далее. Казалось, ничего не помогло, и я просто не могу пробить дыру в этой ментальной блокаде: /
Я знаю, что возможно использовать библиотеку и создать свой собственный автономный сканер штрих-кода. Я читал, что использование «Сканера штрих-кода», предоставленного людьми Zxing, на сегодняшний день является самым простым решением (через Intent). К сожалению, это не вариант, и желательно отдельное приложение.
Итак, чтобы подвести итог моей проблеме:
- Как интегрировать исходную библиотеку ZXing в мой проект Android Code через Eclipse?
- После интеграции ... как использовать библиотеку, чтобы "загрузить" функцию сканирования?
- Пошаговое руководство почти предпочтительнее, потому что я только начал работать в Eclipse.
Я попытался сделать мой проект кода зависимым от папки Android из исходной папки ZXing. Когда я это делаю, появляется несколько ошибок, в основном связанных с 'org.apache' (??)
Я просто не могу понять ... так что несколько подсказок были бы очень полезны.
Заранее спасибо :)
источник
Ответы:
ОБНОВИТЬ! - РЕШЕНО + ГИД
Мне удалось разобраться :) А ниже вы можете прочитать пошаговое руководство, которое, надеюсь, может помочь другим с той же проблемой, что и я;)
zxing src
.ant -f core/build.xml
введите, нажмите Enter, и пусть Apache поработает волшебно [ возникли проблемы?]core.jar
... нажмите Enter!Теперь вам просто нужно исправить несколько ошибок в переводах и файле AndroidManifest.xml :) Теперь вы можете успешно скомпилировать, и теперь у вас будет работающее автономное приложение для сканирования штрих-кода, основанное на исходном коде ZXing;)
Счастливых программистов - надеюсь, это поможет другим :)
источник
AndroidManifest.xml
файле? При проверке я не вижу ошибок в этом файле. Благодарность!Вот пошаговое руководство о том, как сгенерировать и отобразить QR-код с помощью библиотеки ZXing без необходимости установки стороннего приложения. Примечание: вам не нужно собирать ZXing с помощью ANT или любого другого инструмента сборки. Файл
core.jar
доступен в выпущенном zip-архиве (см. Ниже).ZXing-*.zip
)core.jar
вcore/
каталоге.core.jar
его вlibs
каталог вашего проекта Android. Когда появится запрос, выберите Копировать .Contents.java
&QRCodeEncoder.java
) в основной пакет вашего проекта Android.ImageView
элемент в своей деятельности, чтобы отображать сгенерированный QR-код, если у вас его еще нет. Ниже приведен пример: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(); } }
источник
В
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
источник
Возникли проблемы при сборке с помощью 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
причину более короткого синтаксиса я нашел на каком-то сайте, который говорит:
Затем я перезапустил cmd (важно, потому что оболочка DOS читает только переменные env при запуске, поэтому изменение env var потребует от вас использовать новую оболочку для получения обновленного значения)
и, наконец,
ant -f core/build.xml
сработало.источник
Поскольку некоторые ответы устарели, я хотел бы предоставить свой собственный -
Чтобы интегрировать библиотеку 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 ):
Наконец, добавьте этот код в свой 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 в качестве вдохновения для вашего собственного приложения:
Тогда вам понадобится 4 файла Java с GitHub :
И 3 файла Jar из репозитория Maven :
(Вы можете создать файлы Jar самостоятельно
mvn package
- если вы зашли на ZXing с GitHub и установили на свой компьютер инструменты ant и maven ).Примечание: если ваш проект не распознает файлы Jar, вам может потребоваться обновить версию Java в свойствах проекта:
источник
Ставить
compile 'com.google.zxing:core:2.3.0'
в ваши зависимости Gradle. Это так просто. До использования Android Studio и системы сборки Gradle.
источник
Вы видели вики-страницы на сайте zxing? Кажется, вам могут пригодиться GettingStarted , DeveloperNotes и ScanningViaIntent .
источник
Если вам просто нужен core.jar из zxing, вы можете пропустить этот процесс и получить предварительно созданные JAR-файлы со страницы вики- сайта GettingStarted.
Последняя версия ZXing (2.2) не имеет core.jar в основной папке, но вы можете получить core.jar из репозитория zxing Maven здесь
источник
Пошаговая настройка zxing 3.2.1 в eclipse
источник
Я перепробовал все возможные способы добиться этого, а затем обнаружил миниатюрную версию xZing от JourneyApps. Я портировал это для eclipse и опубликовал на GitHub.
Если вы используете eclipse, используйте этот проект: -
https://github.com/hiteshsahu/XZing-Barcode-Scanner-Minified-Eclipse
Если вы используете Studio, используйте этот проект: -
https://github.com/journeyapps/zxing-android-embedded
Преимущества
Встроенный сканер штрих-кода в вашем приложении не требуется для установки сторонних приложений с помощью playstore.
Вам не нужно путаться между банками Core, Android client и т. Д., Просто отбросьте эти пакеты и соответствующие макеты в свой проект, и все готово. Требуется только Jar - com.google.zxing: core: 3.2.0, который можно загрузить с
http://mvnrepository.com/artifact/com.google.zxing/core/3.2.0
Нет необходимости добавлять тонны пакетов, см. Изображения ниже для сравнения
Перед :-
После :-
Самая важная часть - они легко настраиваются, т.е. вы можете добавить вспышку, использовать ее во фрагменте и поддерживать изменение ориентации.
Вы можете использовать это действие «Захват» в приложении 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"); } } } }
Удачной интеграции !!
источник
Ребята из zxing упростили создание проекта Android с помощью 1.7. Это не так больно, как раньше. Это быстрый блог для всех, кто хочет быстро создать проект zxing для Android.
Android-проект для zxing 1.7 (расчет 20 июня).
http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html( БОЛЬШЕ НЕ ДОСТУПНО )источник
Зачем использовать внешнюю библиотеку, если сервисы Google Play (начиная с версии 7.8.0 ) включают декодер штрих-кода.
источник
Я просто написал метод, который декодирует сгенерированные штрих-коды
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; }
источник
Эта библиотека работает как шарм, ее легко интегрировать и использовать. https://github.com/dm77/barcodescanner
источник
ОБНОВЛЕНИЕ 2020: просто добавьте это в свой файл Gradle. Работает отлично!
repositories { jcenter() } implementation 'me.dm7.barcodescanner:zxing:1.9.13'
источник
Недавно я использовал мобильное зрение Google как на ios, так и на android. Я настоятельно рекомендую использовать Google Barcode Scan. Он довольно быстро реагирует на любую ориентацию, и время обработки довольно быстрое. Это называется Google Mobile Vision.
https://developers.google.com/vision/
https://codelabs.developers.google.com/codelabs/bar-codes/#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
здесь не определено