Как интегрировать сканер штрих-кода Zxing без установки реального приложения zxing (невозможно разрешить символ: .android.CaptureActivity)?

Я хочу интегрировать сканер zxing в мое приложение без необходимости внешнего приложения (zxing-сканер из магазина воспроизведения). Это мой код

Button scan = (Button) findViewById(R.id.scan_button); scan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent.setPackage("com.mypackage.app"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, SCANNER_REQUEST_CODE); } }); @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == SCANNER_REQUEST_CODE) { // Handle scan intent if (resultCode == Activity.RESULT_OK) { // Handle successful scan String contents = intent.getStringExtra("SCAN_RESULT"); String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT"); byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES"); int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE); Integer orientation = (intentOrientation == Integer.MIN_VALUE) ? null : intentOrientation; String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL"); } else if (resultCode == Activity.RESULT_CANCELED) { // Handle cancel } } else { // Handle other intents } } 

AndroidManifest.xml

 <activity android:name="com.google.zxing.client.android.CaptureActivity" android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" 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> 

Моя Android-студия сказала, что не может разрешить символ: .android.CaptureActivity и если я запустил это, произошла ошибка

Java.lang.ClassNotFoundException: Не нашел класс "com.google.zxing.client.android.CaptureActivity"

Что случилось?

Solutions Collecting From Web of "Как интегрировать сканер штрих-кода Zxing без установки реального приложения zxing (невозможно разрешить символ: .android.CaptureActivity)?"

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

ZXing, являющийся проектом с открытым исходным кодом, позволяет (как описано на веб-сайте ZXing) использовать его функции в качестве библиотеки проектов, а не форсировать установку сторонних приложений на устройстве пользователя, на мой взгляд, это предпочтительный вариант для большинства проектов.

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

Общий процесс таков:

  1. Загрузка исходного кода ZXing и основного файла.
  2. Импорт проекта ZXing в любую среду, в которой вы хотите (Eclipse / Studio)
  3. Определение проекта ZXing для работы в качестве библиотеки и исправления кода для удовлетворения этих требований.
  4. Добавление ZXing к пути сборки собственного проекта
  5. Добавление методов ZXing в соответствии с требованиями вашего приложения.

Ниже приведена подробная процедура для тех, кто использует Eclipse (который также может быть легко реализован для Studio):

Загрузка исходного кода ZXing и основного файла

  1. Перейдите на страницу проекта Ziting GitHub ( https://github.com/zxing/zxing ) и нажмите «Загрузить zip».
  2. Извлеките файлы (я рекомендую использовать где-нибудь большинство других источников библиотеки)

Импорт проекта ZXing в Eclipse

  1. Открыть Eclipse.
  2. Нажмите «Файл»> «Импорт», «Android»> «Существующий код для Android в рабочую область», в окне выбора перейдите в папку, в которую вы извлекли zip-файл ZXing, и выберите папку «Android». Теперь Eclipse обнаруживает, что папка содержит проект под названием «captureActivity», импортирует этот проект.
  3. Теперь вы должны увидеть активность захвата в своей рабочей области. В зависимости от версии ZXing вам может потребоваться присвоить файл core.jar проекту ZXing, чтобы проверить, действительно ли это версия вашей версии, открыть папку libs проекта captureActivity и проверить, существует ли файл core.jar, если нет Чем вы должны добавить его самостоятельно, в противном случае перейти к следующей главе.

    5.1. Чтобы добавить файл core.jar, щелкните правой кнопкой мыши проект captureActivity в рабочей области Eclipse и выберите «Путь сборки»> «Настройка пути сборки»

    5.2. В боковом меню выберите «Путь сборки Java» и перейдите на вкладку «Библиотеки».

    5.3. Нажмите «Добавить внешние JAR» и перейдите туда, где вы первоначально экспортировали ZXing zip.

    5.4. Войдите в основную папку и выберите core.jar (имя может отличаться в зависимости от версии ZXing) и нажмите «Открыть»

    5.5. Теперь вы должны увидеть core.jar в списке путей сборки, нажмите вкладку «Заказ и экспорт» и проверьте core.jar

Определение ZXing как библиотеки и исправление кода

  1. Если вы еще не находитесь в окне пути сборки, щелкните правой кнопкой мыши проект captureActivity и выберите «Путь сборки»> «Настройка пути сборки».
  2. В боковом меню выберите Android и выберите «Библиотека», нажмите «ОК», чтобы выйти из окна
  3. Теперь, в зависимости от версии ZXing, вы можете заметить, что Eclipse отмечает некоторые из java-файлов, содержащих ошибки, если это так, вам придется исправить код, чтобы соответствовать версии jroid-версии для Android, иначе просто перейдите к следующей главе

    8.1. Откройте каждый сломанный java-файл в редакторе и замените сломанные операторы Switch целыми операторами If Else, это раздражающая часть, которую я знаю.

Добавить ZXing в качестве библиотеки вашего собственного проекта

  1. Если все хорошо, то captureActivity должен появиться как любая нормальная папка проекта в вашей рабочей области, никаких ошибок или красных! знак. Чтобы определить ZXing как библиотеку в вашем собственном проекте, щелкните правой кнопкой мыши ваш проект в рабочей области и выберите «Путь сборки»> «Настроить путь сборки».
  2. В боковой панели выберите Android. Нажмите кнопку «Добавить» в правой нижней части окна, а в окне выберите «captureActivity».
  3. Вот и все, ваш проект теперь может использовать ZXing как независимую библиотеку без необходимости какой-либо сторонней установки.

Добавление методов ZXing, требуемых вашим приложением

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

Запуск сканера и захват QR-кода:

 Intent intent = new Intent(getApplicationContext(),CaptureActivity.class); intent.setAction("com.google.zxing.client.android.SCAN"); intent.putExtra("SAVE_HISTORY", false); startActivityForResult(intent, 0); 

Получение результатов сканирования в onActivityResult ():

 if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents = data.getStringExtra("SCAN_RESULT"); Log.d(TAG, "contents: " + contents); } else if (resultCode == RESULT_CANCELED) { // Handle cancel Log.d(TAG, "RESULT_CANCELED"); } } 

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

 <uses-permission android:name="android.permission.CAMERA" /> <activity android:name="com.google.zxing.client.android.CaptureActivity" android:screenOrientation="landscape" > </activity> 

Надеюсь, это поможет другим сохранить несколько хороших часов исследований.

В качестве дополнительного бонуса я рекомендую прочитать: https://biocram.wordpress.com/2013/06/11/integrate-zxing-as-a-library-inside-an-android-project/

Поскольку все ответы, которые я нашел до сих пор, основаны на Eclipse и довольно датированы на данный момент, я добавляю свой ответ, чтобы добавить ZXing как отдельную библиотеку в Android Studio (2.1.2).

Я поместил скомпилированный проект в Github https://github.com/tarun0/ZXing-Standalone-library Просто добавьте модуль zxing_standalone в свой проект, и вам будет хорошо идти. Для получения дополнительной информации или для его компиляции для более новых версий, продолжайте чтение.

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

  1. Загрузите исходный код библиотеки ZXing из https://github.com/zxing/zxing/. Для этого нам потребуется только каталог android . Поэтому, если у вас уже есть эта папка, вам не нужно загружать всю ветвь размером около 126 МБ.
  2. Загрузите последнюю core-xxxjar из http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  3. Добавьте проект андроида в свой собственный проект. Для этого сначала выберите Project из Project Explorer (см. Изображение)

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

  1. Теперь нажмите на свой проект, а затем щелкните его правой кнопкой мыши и выберите « New > « Module > « Import Gradle Project . Теперь выберите каталог android из загруженного исходного кода (в шаге 1). (Ссылка ниже для абсолютного новичка). При желании измените имя и задайте параметры по умолчанию для импорта. Введите описание изображения здесь
  2. В этом импортированном проекте создайте папку libs и поместите файл core.jar загруженный на шаге 2 в этой папке. Затем откройте « Project Structure из меню «Файл» и добавьте этот файл core.jar в качестве зависимости.

Введите описание изображения здесь На шаге 2 Выберите <code> Добавить зависимость файла </ code>

  1. Загрузите CameraConfigurationalUtils.java и вставьте его в проект. Введите описание изображения здесь

  2. Теперь сделайте несколько изменений в файле gradle импортированного проекта. Измените apply plugin: 'com.android.application' чтобы apply plugin: 'com.android.library' чтобы сообщить системе, что это библиотека. И удалите applicationId ...

  3. В файле Manifest.xml импортированного проекта выполните следующие изменения. В <application... , удалите android:icon... и android:logo... и удалите этот <category android:name="android.intent.category.LAUNCHER"/> из фильтра намерений, так как это Теперь является библиотекой и не должна находиться на панели запуска (если вы не удалите это, у вас будет две операции запуска).

  4. В файле build.gradle вашего проекта в build.gradle dependencies добавьте этот compile project (':android') строк compile project (':android') Здесь замените android на имя, которое вы выбрали, при импорте проекта на шаге 4. Синхронизируйте и очистите проект. Вы увидите некоторые ошибки в операторах switch . Нажмите на эти коммутационные шкафы и выберите опцию replace with if предоставленную Android Studio.

Вот и все. Теперь вы можете использовать библиотеку ZXing в своем приложении. 🙂

Чтобы использовать добавленную библиотеку, просто используйте Intents как указано в самом первом ответе выше (копирование только тех же кодов):

Во время сканирования (например, при нажатии кнопки) отправьте Intent:

 Intent intent = new Intent(getApplicationContext(),CaptureActivity.class); intent.setAction("com.google.zxing.client.android.SCAN"); intent.putExtra("SAVE_HISTORY", false); startActivityForResult(intent, 0); 

Затем в OnActivityResult :

 if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents = data.getStringExtra("SCAN_RESULT"); Log.d(TAG, "contents: " + contents); } else if (resultCode == RESULT_CANCELED) { // Handle cancel Log.d(TAG, "RESULT_CANCELED"); } } 

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

Пожалуйста, прочитайте этот ответ одним из авторов кода, касающегося копирования кода в ваше собственное приложение: https://stackoverflow.com/a/9942761

Ссылки: https://stackoverflow.com/a/29818279 https://stackoverflow.com/a/29960361 И еще несколько других блогов / SO ответов.

Я не знаю, почему это произошло, но, наконец, я использую другую библиотеку. Я использую Zxing-андроид-минимальный и учебник отсюда и здесь . Теперь это работает.

Если у вас есть проблемы с поиском банок, подобных мне, здесь у вас есть URL:

http://repo1.maven.org/maven2/com/google/zxing/

Я очень опаздываю, но я хочу ответить на это, чтобы кто-то еще помог позже. Это не означает, что вышеупомянутые методы и решения ошибочны, это просто дополнительная информация, поэтому разработчику он будет выбирать лучший способ. Хорошо иметь тысячи способов, чем иметь один.

Итак, давайте начнем с нашей градитуры и добавим

 compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar' compile 'com.google.zxing:core:3.2.1' 

Вызов модуля (например: нажатие кнопки):

 IntentIntegrator integrator = new IntentIntegrator(Home.this); integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES); integrator.setPrompt("Scan Code"); integrator.setCameraId(0); integrator.setBeepEnabled(true); integrator.setBarcodeImageEnabled(false); integrator.initiateScan(); 

Получите результаты:

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

}

Для получения дополнительной информации вы можете проверить ссылку https://github.com/pethoalpar/ZxingExample

Вот способ, который работает на eclipse:

Интеграция ZXing в приложении eclipse android

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

Разработка ответа stackex …. Создайте действие с любым именем.

 public class CaptureActivityAnyOrientation extends CaptureActivity { } 

В манифесте определите желаемую ориентацию или оставьте как показано ниже для работы как в ландшафте, так и в portait.

 <activity android:name=".CaptureActivityAnyOrientation" android:screenOrientation="fullSensor" android:stateNotNeeded="true" android:theme="@style/zxing_CaptureTheme" android:windowSoftInputMode="stateAlwaysHidden"/> 

Наконец, используйте действие, созданное как setCaptureActivity.

 IntentIntegrator.forSupportFragment(fragment) .setCaptureActivity(CaptureActivityAnyOrientation.class) .setOrientationLocked(false) .setBeepEnabled(true) .addExtra("PROMPT_MESSAGE", "Scan QR Code") .initiateScan(IntentIntegrator.QR_CODE_TYPES); 

Надеюсь это поможет.

В моем коде я пришел к этой версии:

 Camera.PreviewCallback myCallBack = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters parameters = camera.getParameters(); int width = parameters.getPreviewSize().width; int height = parameters.getPreviewSize().height; int format = parameters.getPreviewFormat(); LuminanceSource source = null; if(format == ImageFormat.NV21) //YCbCr_420_SP) { source = new PlanarYUVLuminanceSource(imgData, bitmapWidth, bitmapHeight, 0,0, bitmapWidth,bitmapHeight, false); } else { throw new UnsupportedOperationException("Unsupported image format "); } BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source)); try { Result result = reader.decode(bBitmap); txt.setText(result.getText()) } catch (NotFoundException e) { //txt.setText(""); } } }; 

с

 import android.hardware.Camera; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.PlanarYUVLuminanceSource; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; Camera mCamera; MultiFormatReader reader; TextView txt; 

Надеюсь, это поможет кому-то.

Antonino