Android 通过集成到应用程序中的ZXing获取QR扫描结果

Android 通过集成到应用程序中的ZXing获取QR扫描结果,android,android-intent,qr-code,zxing,Android,Android Intent,Qr Code,Zxing,我曾经创建过一个独立的Android库项目,其中包含ZXing源代码(ZXing v2.1)。它编译得很好,如果我运行CaptureActivity,我可以按预期读取二维码 我有另一个Android项目,我想从中提取这个库。我已经正确地建立了图书馆关系 我遇到的问题是,如何通过IntentIntegrator(已提及)启动ZXing扫描仪的本地副本 我尝试修改IntentIntegrator.initiateScan()方法以使用CaptureActivity的本地副本,从而正确加载QR扫描仪但

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

我有另一个Android项目,我想从中提取这个库。我已经正确地建立了图书馆关系

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

我尝试修改IntentIntegrator.initiateScan()方法以使用CaptureActivity的本地副本,从而正确加载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());
但是initiateScan方法现在看起来是这样的:

IntentIntegrator integrator = new IntentIntegrator(getActivity());
integrator.initiateScan(getActivity());
  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;
  }
public AlertDialog initiateScan(活动行为,集合desiredBarcodeFormats)
{
意向意向扫描=新意向(BS_软件包+“.SCAN”);
intentScan.addCategory(Intent.CATEGORY\u默认值);
//检查要扫描的代码类型
if(desiredBarcodeFormats!=null){
//设置所需的条形码类型
StringBuilder joinedbycoma=新StringBuilder();
for(字符串格式:desiredBarcodeFormats){
if(joinedbycoma.length()>0){
joinedbycoma.append(',');
}
joinedbycoma.append(格式);
}
intentScan.putExtra(“SCAN_格式”,由逗号连接到toString());
}
//这是关键
设置SingleTargetApplication(act.getPackageName());
字符串targetAppPackage=findTargetAppPackage(intentScan);
if(targetAppPackage==null){
返回showDownloadDialog();
}
intentScan.setPackage(targetAppPackage);
intentScan.addFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
intentScan.addFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u WHEN\u TASK\u RESET);
附件(intentScan);
startActivityForResult法案(意向扫描、请求代码);
返回null;
}

重要的是确保BS_包指向CaptureActivity包,您称之为“act.startActivityForResult…”,而不仅仅是“startActivityForResult…”使用将调用扫描仪的应用程序的程序包名称调用setSingleTargetApplication。

尝试更改行
startActivityForResult(intentScan,REQUEST\u code)

act.startActivityForResult(意图扫描,请求代码)


您无需对包含
FindTargetPackage
的代码进行注释,只需通过调用
setSingleTargetApplication()
(如果您是唯一使用此库的应用程序)设置目标应用程序的包即可尝试更改行
startActivityForResult(intentScan,REQUEST\u code)

act.startActivityForResult(意图扫描,请求代码)


您无需对包含
FindTargetPackage
的代码进行注释,只需通过调用
setSingleTargetApplication()
(如果您是唯一使用此库的应用程序)设置目标应用程序的包即可。

谢谢iTech,这两件事是问题的主要原因。我还必须停止在“intentScan”变量中硬编码活动,而是使用原始代码:Intent intentScan=new Intent(BS_PACKAGE+“.SCAN”);并且必须确保BS_软件包指向CaptureActivity所在的软件包。非常感谢。谢谢伊泰克,这两件事是最大的问题。我还必须停止在“intentScan”变量中硬编码活动,而是使用原始代码:Intent intentScan=new Intent(BS_PACKAGE+“.SCAN”);并且必须确保BS_软件包指向CaptureActivity所在的软件包。非常感谢。