Android: сканирование штрих-кода zxing успешно, но не возвращается из активности
Я успешно использую zxing для сканирования кодов, вызывая установленное намерение считывателя штрих-кода, но когда он подает звуковой сигнал и указывает на хорошее сканирование, я ожидаю, что активность zxing вернет управление, чтобы я мог обработать результат, но он сидит там и пытается для повторного сканирования. Я должен нажать кнопку "Назад", а затем он вернется, и я могу сделать следующий шаг. Есть ли какой-то очевидный флаг, который я пропускаю при вызове сканера?
Любые советы с благодарностью получены. Большое спасибо.
Здесь мой код:
public boolean onTouchEvent(final MotionEvent event) {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("com.google.zxing.client.android.SCAN.SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
return true;
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
// Handle successful scan
String s = "http://www.google.com/search?q=";
s += contents;
Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s));
startActivity(myIntent1);
}
else
if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
}
}
Ответы
Ответ 1
Почему бы не использовать предоставленный класс IntentIntegrator
? Это единственный подход, упомянутый в проектных документах, вы на это смотрели? https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
Я создал его, чтобы обернуть эти детали отправки и анализа Intent, чтобы вы не делали опечатки. Например, нет такой вещи, как "com.google.zxing.client.android.SCAN.SCAN_MODE".
Ответ 2
Здесь полный ответ на мой собственный вопрос, надеюсь, что это поможет кому-то:
Go здесь и скопируйте весь класс IntentIntegrator, добавьте его в свое приложение; также перейдите здесь и скопируйте класс IntentResult в свое приложение. Теперь добавьте это в свою активность (или запускайте сканирование с помощью кнопки/независимо):
public boolean onTouchEvent(final MotionEvent event) {
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.initiateScan();
return true;
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (scanResult != null) {
// handle scan result
String s = "http://www.google.com/search?q=";
s += scanResult.getContents();
Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s));
startActivity(myIntent1);
}
// else continue with any other code you need in the method
//...
}
Было бы здорово просто вызвать службы, предоставляемые приложением сканера штрих-кодов, а не копировать и вставлять фрагменты кода в собственное приложение, но это, по-видимому, рекомендуется: (
Ответ 3
Добавить finishActivity (requestCode); в конце метода onActivityResult().
Попробуйте следующее:
Замените первые 2 строки в onTouch на приведенный ниже код. Похоже, проблема заключается в том, что вы сканируете коды, отличные от QR. Удалите фильтр сканирования и проверьте один раз.
Intent intent = new Intent ( "com.google.zxing.client.android.SCAN" );
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
Ответ 4
У меня была такая же проблема, поэтому я попытался использовать класс IntentIntegrator, как рекомендовал Шон Оуэн. У меня все еще была проблема, пока я не понял, что это происходит только при попытке сканирования штрих-кода в портрете (чаще всего на телефонах). Оказывается, изменение ориентации от портрета к пейзажу вызывает двойное сканирование. Я решил это, добавив android:configChanges="orientation|keyboardHidden|screenSize"
к активности в моем манифесте. Вам, вероятно, нужна только ориентация, но это не проверено.
Для всех пользователей, испытывающих эту проблему при создании внутреннего расширения Adobe AIR, обязательно добавьте эту строку не только к манифесту вашего проекта Android, но и к тегу активности в своих дополнениях манифеста Android в вашем приложении.
Ответ 5
Вот решение, которое я использую. Он отлично работает для меня.
Intent intent = new Intent(SelectOptionActivity.this, CaptureActivity.class);
intent.putExtra("SCAN_MODE", "ONE_D_MODE");
intent.putExtra("SCAN_FORMATS", "CODE_39,CODE_93,CODE_128,DATA_MATRIX,ITF,CODABAR,EAN_13,EAN_8,UPC_A,QR_CODE");
intent.setAction(Intents.Scan.ACTION);
startActivityForResult(intent, 1);
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 1 && resultCode == RESULT_OK) {
final String contents = intent.getStringExtra(Intents.Scan.RESULT);
final String formatName = intent.getStringExtra(Intents.Scan.RESULT_FORMAT);
}
}