Получение результатов QR-сканирования через ZXing, интегрированное в ваше приложение

Я использовал этот ответ, чтобы создать автономный проект библиотеки Android, в котором есть исходный код ZXing (ZXing v2.1). Он компилируется отлично, и если я запустил CaptureActivity, я могу прочитать QR-код, как ожидалось.

У меня есть другой проект Android, из которого я хочу потянуть эту библиотеку. Я правильно установил связь с библиотекой.

Проблема, с которой я столкнулась, заключается в том, как мне запустить локальную копию сканера ZXing через IntentIntegrator (упомянутый здесь).

Я пробовал модифицировать метод IntentIntegrator.initiateScan() для использования моей локальной копии CaptureActivity и загружает QR-сканер должным образом. Однако, как только QR-код сканируется, информация QR отображается на экране вместо того, чтобы отправить результат обратно на мою вызывающую активность в onActivityResult.

Как я могу заставить его отправлять результаты QR-сканирования в onActivityResult моей активности?

Для справки, вот что я изменил метод IntentIntegrator.initiateScan():

  public AlertDialog initiateScan(Activity act, Collection<String> desiredBarcodeFormats) {       

  //Hardcoding name of activity to call --> is this where I've gone wrong?
    Intent intentScan = new Intent(act, CaptureActivity.class);

    intentScan.addCategory(Intent.CATEGORY_DEFAULT);

    // check which types of codes to scan for
    if (desiredBarcodeFormats != null) {
      // set the desired barcode types
      StringBuilder joinedByComma = new StringBuilder();
      for (String format : desiredBarcodeFormats) {
        if (joinedByComma.length() > 0) {
          joinedByComma.append(',');
        }
        joinedByComma.append(format);
      }
      intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString());
    }


//Commented this out because it didn't seem to find my class...

//    String targetAppPackage = findTargetAppPackage(intentScan);
//    if (targetAppPackage == null) {
//      return showDownloadDialog();
//    }
//    
//    
//    intentScan.setPackage(targetAppPackage);
    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    attachMoreExtras(intentScan);
    startActivityForResult(intentScan, REQUEST_CODE);
    return null;
  }

И я запускаю сканирование следующим образом:

IntentIntegrator integrator = new IntentIntegrator(getActivity());
integrator.initiateScan(getActivity());

Я чувствую, что мне не хватает чего-то легкого здесь, любой толчок в правильном направлении будет большим.

Решение

Вот что закончилось работать. Я все равно вызываю его так же:

IntentIntegrator integrator = new IntentIntegrator(getActivity());
integrator.initiateScan(getActivity());

Но метод initiateScan теперь выглядит следующим образом:

  public AlertDialog initiateScan(Activity act, Collection<String> desiredBarcodeFormats) 
  {

    Intent intentScan = new Intent(BS_PACKAGE + ".SCAN");

    intentScan.addCategory(Intent.CATEGORY_DEFAULT);

    // check which types of codes to scan for
    if (desiredBarcodeFormats != null) {
      // set the desired barcode types
      StringBuilder joinedByComma = new StringBuilder();
      for (String format : desiredBarcodeFormats) {
        if (joinedByComma.length() > 0) {
          joinedByComma.append(',');
        }
        joinedByComma.append(format);
      }
      intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString());
    }

    //THIS WAS THE KEY
    setSingleTargetApplication(act.getPackageName());

    String targetAppPackage = findTargetAppPackage(intentScan);
    if (targetAppPackage == null) {
      return showDownloadDialog();
    }

    intentScan.setPackage(targetAppPackage);
    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    attachMoreExtras(intentScan);
    act.startActivityForResult(intentScan, REQUEST_CODE);
    return null;
  }

Важно убедиться, что BS_PACKAGE указывает на пакет CaptureActivity, который вы называете "act.startActivityForResult..." вместо "startActivityForResult..." и вы вызываете setSingleTargetApplication с именем пакета приложения, которое будет вызывать сканер.

Ответ 1

Попробуйте изменить строку startActivityForResult(intentScan, REQUEST_CODE);

to act.startActivityForResult(intentScan, REQUEST_CODE);

Вам не нужно комментировать код, содержащий findTargetAppPackage, просто установите целевой пакет приложения, вызвав setSingleTargetApplication() (если вы используете только эту библиотеку)