Android: ZXING сканирование штрих-кода успешно, но не возвращается из активности

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

Любой совет с благодарностью получен. Большое спасибо.

Вот мой код:

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
                }
            }
        }
    }

Ответы на вопрос(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);

        }
    }

поэтому я попытался использовать класс IntentIntegrator, как рекомендовал Шон Оуэн. У меня все еще была проблема, пока я не понял, что это происходит только при попытке сканировать штрих-код в портретной ориентации (чаще всего на телефонах). Оказывается, смена ориентации с портретной на альбомную вызывает двойное сканирование. Я решил это, добавивandroid:configChanges="orientation|keyboardHidden|screenSize" к активности в моем манифесте. Возможно, вам нужна только ориентация, но это не проверено.

Для всех пользователей, сталкивающихся с этой проблемой при создании собственного расширения Adobe AIR, обязательно добавьте эту строку не только в манифест проекта Android, но и в тег активности в дополнениях манифеста Android в файле app.xml.

 Christine16 янв. 2017 г., 11:48
Помогает, если действие, с которого вы запускаете CaptureActivity, находится в альбомном режиме. Я добавилandroid:screenOrientation="landscape" к этой деятельности в Манифесте. Который работал для меня.
Решение Вопроса

IntentIntegrator учебный класс? Это единственный подход, упомянутый в документации проекта, вы смотрели на них?https: //github.com/zxing/zxing/wiki/Scanning-Via-Inten

Я создал его, чтобы обернуть эти детали отправки и разбора Intent, чтобы вы не делали опечаток. Например, такого понятия, как «com.google.zxing.client.android.SCAN.SCAN_MODE», не существует.

 Barry13 июн. 2012 г., 19:12
Ладно, все работает! Извините, я не понимал, что вы хотите добавить два целых класса в мое приложение (IntentIntegrator и IntentResult). Первоначальный план, использующий около 10 строк кода для вызова установленного сканера, был идеальным, если бы я мог найти способ заставить его работать. Таким образом, обновления для сканера = обновления для моего приложения тоже, поэтому я должен следить за вашими изменениями вручную :( То, что вы сказали, не существует, произошло отссылк - разговор, в котором ты участвовал в прошлом году. Спасибо за помощь
 Barry13 июн. 2012 г., 18:36
Извините, Шон, я нуб: импорт com.google.zxing.integration.android.IntentIntegrator; не удается, так как com.google не может быть решен. Я где-то пропускаю ссылку? Большое спасибо

Попробуйте это: замените первые две строки в onTouch приведенным ниже кодом. Кажется, проблема заключается в сканировании кодов, отличных от QR. Пожалуйста, удалите фильтр сканирования и проверьте один раз.

Intent intent = new Intent ("com.google.zxing.client.android.SCAN"); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

 Alfred13 июн. 2012 г., 17:24
Как показывает ваш код, вы сканируете только QR-коды? Если вы попробуете отсканировать 1D и матрицу, он продолжит показывать зеленые точки без какого-либо сканирования.
 Alfred13 июн. 2012 г., 17:43
Барри, я отредактировал свой ответ, пожалуйста, проверь, он работает ..
 Barry13 июн. 2012 г., 17:08
Извините, Алфи, этопосл проблема. Выполнение никогда не выполняется, каждый раз «обрабатывает успешное сканирование», пока я не нажму клавишу «Назад». Кажется, что оно зацикливается на самом сканировании и никогда не передает управление моему коду вообще.
 Barry13 июн. 2012 г., 17:33
С помощью приведенного выше кода он успешно сканирует QR, EAN13 и т. Д., Но это мое первое знакомство с zxing, поэтому любые другие указатели приветствуются, но моя главная проблема - заставить zxing отпустить, когда он получит хороший результат.
 Barry13 июн. 2012 г., 17:54
Извините, без изменений! Работает точно так же - успешное сканирование; звуковой сигнал сканера; продолжает искать код, и если я задержусь над уже снятым штрих-кодом, он сканирует его и снова издает звуковой сигнал; Я нажимаю назад - дважды - и работа сканера закрывается, и веб-браузер выключается и находит результат (правильно отсканированный): <

ИдтиВо и скопируйте весь класс 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
      //...
    }

Было бы здорово просто позвонить в службы, предоставляемые приложением сканера штрих-кода, а не копировать и вставлять куски кода в собственное приложение, но, похоже, это рекомендуемый способ:

 Barry14 июн. 2012 г., 09:57
Извините, Шон, я не хотел скулить (хотя, вероятно, это было - это был долгий день, извиняюсь). Мой первоначальный удар, скопированный из более раннего ответа здесь, состоял из нескольких строк, в которых использовались намерения, предложенные вашим приложением, что было бы идеально. Вы рекомендовали мне использовать IntentIntegrator, который является другим маршрутом, и, конечно, он работает отлично. Мой первый взлом былтак близк - если бы я мог получить ваше намерение выпустить после успешного сканирования, я бы получил функциональность в 10 строк, вместо добавления 500 строк и двух классов. Ура, Б.
 Sean Owen13 июн. 2012 г., 21:28
Я не уверен, что понимаю твой последний комментарий. Это минимальный объем кода, который вы можете скопировать и вставить, поскольку вы используете предоставленную библиотеку интеграции. Извините, это не может быть 0 строк, конечно. Вы не можете использовать библиотеку интеграции. Но тогда вы перепишете его код, который может быть десятками строк, конечно. Но это еще не все. Конечно, сделайте это, если хотите - в чем разница между переизобретением необходимого кода и копированием предоставленного необходимого кода?

Ваш ответ на вопрос