Ответ 1
Я не знаю, почему это произошло, но, наконец, я использую другую библиотеку. Я использую Zxing-android-minimal и учебное пособие из здесь и здесь. Теперь это работает.
Я хочу интегрировать 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"
Что случилось?
Я не знаю, почему это произошло, но, наконец, я использую другую библиотеку. Я использую Zxing-android-minimal и учебное пособие из здесь и здесь. Теперь это работает.
Хотя уже был дан ответ, я чувствую себя как углубленное решение для тех, кто хочет использовать ZXing в качестве библиотеки, не используя какой-либо метод автоматической установки, например ANT.
ZXing, являющийся проектом с открытым исходным кодом, позволяет (как описано на веб-сайте ZXing) использовать свои функции в качестве библиотеки проектов, а не форсировать установку сторонних приложений на устройстве пользователя, на мой взгляд, это предпочтительный вариант для большинства проектов.
Важно отметить, что этот способ является приемлемым для создателей и не будет нарушать ни один из их условий использования, поскольку мы не собираемся копировать их код, а просто используем его как библиотеку нашего проекта.
Общий процесс таков:
Ниже приведена полностью подробная процедура для тех, кто использует Eclipse (который также может быть легко реализован для Studio):
Загрузка исходного кода ZXing и основного файла
Импорт проекта ZXing в Eclipse
Теперь вы должны увидеть активность захвата в своей рабочей области. В зависимости от для версии 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 как библиотеки и исправление кода
Теперь, в зависимости от версии ZXing, вы можете заметить, что Eclipse отмечает некоторые из java файлов, содержащих ошибки, если это так, вам придется исправить код, чтобы соответствовать версии jroid-версии для Android, иначе просто перейдите к следующая глава
8,1. Откройте каждый сломанный java файл в редакторе и замените сломанные операторы Switch цепочкой операторов If Else, это досадная часть, которую я знаю.
Добавить 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
в свой проект, и вы будете хороши идти. Чтобы узнать подробности или скомпилировать его для более новых версий, продолжайте чтение.
Это может показаться длинной процедурой, но как только вы ее пройдете, вы найдете ее довольно простой и короткий.
android
. Поэтому, если у вас уже есть эта папка, вам не нужно загружать всю ветвь размером около 126 МБ.core-x.x.x.jar
из http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/Project
из Project Explorer
(см. Изображение)New
> Module
> Import Gradle Project
. Теперь выберите каталог android
из загруженного исходного кода (на шаге 1). (Ссылка ниже для абсолютного новичка). При желании измените имя и задайте параметры по умолчанию для импорта.
libs
и поместите файл core.jar
, загруженный на шаге 2 в этой папке. Затем откройте Project Structure
из меню файла и добавьте этот файл core.jar
в качестве зависимости.Загрузите CameraConfigurationalUtils.java и вставьте его в проект.
Теперь сделайте несколько изменений в импортированном проекте gradle.
Измените apply plugin: 'com.android.application'
на apply plugin: 'com.android.library'
, чтобы сообщить системе, что это библиотека. И удалите оператор applicationId ...
.
В импортированном проекте Manifest.xml
выполните следующие изменения.
В теге <application...
удалите android:icon...
и android:logo...
и удалите этот <category android:name="android.intent.category.LAUNCHER"/>
из фильтра намерений, так как теперь это библиотека и не должна находиться на панели запуска (если вы не удалите это, у вас будет две активности запуска).
В файле проекта 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.
Я очень опаздываю, но я хочу ответить на это, чтобы кто-то еще помог позже. Это не значит, что вышеупомянутые методы и решения ошибочны, это просто дополнительная информация, поэтому разработчику он будет выбирать лучший способ. Хорошо иметь тысячи способов, чем иметь.
Итак, давайте начнем с нашего 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
Если у вас есть проблемы с поиском фляги, такой как я, здесь у вас есть URL-адрес:
В моем коде я пришел к этой версии:
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;
Я надеюсь, что это поможет кому-то.
Антонина
Разработка ответа 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);
Надеюсь, что это поможет.
Вот способ, который работает на eclipse:
Интеграция ZXing в приложении eclipse android
Счастливая интеграция!
Поскольку эта тема старая, но я только что вошел в эту проблему. Итак, я просто пишу для всех, кто работает в Android Studio и хочет интегрировать основные классы. Все, что вам нужно сделать, это просто добавить эту зависимость
implementation 'com.google.zxing:core:x.x.x'
Android Studio автоматически предложит вам последнюю версию для вышеупомянутого.