Подтвердить что ты не робот

Как интегрировать сканер штрих-кода 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"

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

Импорт проекта 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/

Ответ 3

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

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

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

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

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

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

введите описание изображения здесь На шаге 2 Выберите < код > Добавить зависимость файла </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 в блоке dependencies добавьте эту строку 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");
}
}

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

Прочтите этот ответ одного из авторов кода, касающегося копирования кода в ваше собственное приложение: fooobar.com/questions/251291/...

Литература: fooobar.com/questions/251287/... fooobar.com/questions/251292/... И еще несколько других ответов в блогах/SO.

Ответ 4

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

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

compile 'com.journeyapps:zxing-android-embedded:[email protected]'
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

Ответ 6

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

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;

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

Антонина

Ответ 7

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

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

Ответ 9

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

implementation 'com.google.zxing:core:x.x.x'

Android Studio автоматически предложит вам последнюю версию для вышеупомянутого.