【问题标题】:Obtaining QR scan results via ZXing that is integrated into your app通过集成到您的应用程序中的 ZXing 获取 QR 扫描结果
【发布时间】:2013-02-18 05:33:48
【问题描述】:

我使用this answer 创建了一个独立的Android 库项目,其中包含ZXing 源代码(ZXing v2.1)。它编译得很好,如果我运行 CaptureActivity,我可以按预期读取 QR 码。

我有另一个 Android 项目,我想从中提取这个库。我已正确设置了该库关系。

我遇到的问题是,如何通过 IntentIntegrator 启动 ZXing 扫描仪的本地副本(提到 here)。

我尝试修改 IntentIntegrator.initiateScan() 方法以使用我的本地 CaptureActivity 副本,并正确加载 QR 扫描仪。 但是,一旦扫描了二维码,二维码信息就会显示在屏幕上,而不是在 onActivityResult 中将结果发送回我的调用活动。

如何让它将二维码扫描结果发送到我的通话活动的 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());

但initialScan 方法现在看起来像这样:

  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 的应用程序包名称将正在调用扫描仪。

【问题讨论】:

    标签: android android-intent qr-code zxing


    【解决方案1】:

    尝试换行startActivityForResult(intentScan, REQUEST_CODE);

    act.startActivityForResult(intentScan, REQUEST_CODE);

    你不需要注释包含findTargetAppPackage的代码,只需通过调用setSingleTargetApplication()设置你的目标应用程序的包(如果你是唯一使用这个库的应用程序)

    【讨论】:

    • 感谢 iTech,这两件事是最大的问题。我还不得不退出对“intentScan”变量中的 Activity 进行硬编码,而是使用原始代码:Intent intentScan = new Intent(BS_PACKAGE + ".SCAN");并且必须确保 BS_PACKAGE 指向 CaptureActivity 所在的包。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2012-05-21
    • 2022-01-23
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多