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

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

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 Studio сказал, что не может решить символ:.android.CaptureActivity и если я запустил это, произошла ошибка

java.ленг.ClassNotFoundException: не нашел класс "com.гуглить.кодом ZXing.клиент.андроид.CaptureActivity"

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

8 ответов


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

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

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

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

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

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

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

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

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

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

    5.1. Чтобы добавить ядро.jar-файл щелкните правой кнопкой мыши проект captureActivity в рабочей области Eclipse и выберите путь сборки>настроить построить путь

    5.2. В боковом меню выберите Java Build Path и перейдите на вкладку библиотеки.

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

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

    5.5. Теперь вы должны увидеть ядро.jar в списке путей сборки нажмите вкладку" заказ и экспорт " и проверьте ядро.Джар

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

  1. если вы еще не находитесь в окне путь сборки, щелкните правой кнопкой мыши проект captureActivity и выберите путь сборки>настроить путь сборки.
  2. в боковом меню выберите Android и проверьте библиотеку, нажмите Ok, чтобы выйти из окна
  3. Теперь в зависимости от версия ZXing у вас есть вы можете увидеть Eclipse отметить некоторые из файлов java, содержащих ошибки, если это так, вам придется исправить код, чтобы соответствовать версии Android java, в противном случае просто перейти к следующей главе

    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 capture activity также должны быть определены в манифесте проекта, также обратите внимание, что вы должны дать разрешение проекта на использование камеры, как так:

<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-x.x.x.jar от http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  3. добавьте проект android в свой собственный проект. Для этого сначала выберите Project С Project Explorer(см. изображение)

enter image description here

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

enter image description here In step 2 Select <code>Add file dependency</code>

  1. скачать CameraConfigurationalUtils.java и вставить его в проект. enter image description here

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

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

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

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

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

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 И несколько других блогов и ответов.


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


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

Итак, давайте начнем в наш gradle и добавить

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


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

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


разработка ответа 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;

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

Антонино


вот способ, который работает на Eclipse:

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

счастливый интеграции !