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);

        }
    }