【发布时间】: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