【问题标题】:Not receiving an Intent back from Zxing barcode scanner没有收到来自 Zxing 条码扫描器的 Intent
【发布时间】:2014-06-19 07:40:27
【问题描述】:

我知道其他一些人遇到了这个问题,但我已经按照解决方案进行了操作,但它仍然对我不起作用。

我创建了一个新的应用程序,它有 1 个 Activity,有 1 个按钮(扫描按钮)和 2 个文本视图(它们将输出 Zxing 目前返回的格式名称和内容)。

我已按照 ScanningViaIntent 教程进行操作,但似乎没有达到onActivityResult

下面是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final IntentIntegrator integrator = new IntentIntegrator(this);
    Button btnScan = (Button) findViewById(R.id.button1);
    btnScan.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            integrator.initiateScan();
        }
    });
}

public void OnActivityResult(int requestCode, int resultCode, Intent intent)
{
    Log.i("result", "hit line");
    IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

    TextView tv1 = (TextView) findViewById(R.id.textView1);
    TextView tv2 = (TextView) findViewById(R.id.textView2);

    if(scanResult != null)
    {
        System.out.println("format: " + scanResult.getFormatName());
        System.out.println("contents: " + scanResult.getContents());



        tv1.setText(scanResult.getFormatName());
        tv2.setText(scanResult.getContents());
    }
    else
    {
        tv1.setText("ERROR");
    }
}

TextView1 从不说“错误”,因此 scanResult 似乎不是 null 并且我的 Log.i() 行从未被击中,所以我认为 onActivityResult 甚至没有被击中。

这可能与为 OnClick() 方法制作 IntentIntegrator final 有关吗?当我在 OnClick() 中创建 IntentIntegrator 时,我使用 getParent() 将 Activity 传递给构造函数,但是这强制关闭了我的应用,并在 IntentItegrator 中出现 NullReferenceException。

我是否正确使用了库?

感谢您的宝贵时间,

斗篷

【问题讨论】:

  • 你有 CaptureActivity 类吗?
  • 嗨,不,我只有 1 个主要活动,教程是否提到了 CaptureActivity 类?
  • 我已将 IntentIntegrator 和 IntentResult 类复制到我的应用程序中,并将 Zxing 应用程序安装为单独的应用程序(称为 Barcode Scanner)。
  • 请同时发布与您的IntentIntegrator 相关的代码,因为它似乎会成就或破坏此功能。调用 getParent() 也是错误的:如果您不想在 onClick 中有最终 IntentIntegrator,您可以调用 YourActivityName.this
  • FWIW,这是一个工作示例项目,几乎可以完成您的代码所做的所有事情:github.com/commonsguy/cw-omnibus/tree/master/Camera/ZXing

标签: android android-intent zxing


【解决方案1】:

您实际上并没有覆盖方法onActivityResult(),因为您已经实现了OnActivityResult()。结果没有调用您的方法。其他一切看起来都不错。

如果您使用 @Override 注释,您就会发现这种情况——这是个好习惯,因为它会发现这种情况。

【讨论】:

    【解决方案2】:

    你在哪里打电话给startActivityForResult(..)?你可能想使用这样的东西:

    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());
    }
    
    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);
    

    findTargetAppPackage

     private String findTargetAppPackage(Intent intent) {
        PackageManager pm = activity.getPackageManager();
        List<ResolveInfo> availableApps = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        if (availableApps != null) {
          for (ResolveInfo availableApp : availableApps) {
            String packageName = availableApp.activityInfo.packageName;
            if (targetApplications.contains(packageName)) {
              return packageName;
            }
          }
        }
        return null;
      }
    

    要查看更完整的示例,请转到here

    【讨论】:

    • 谢谢,但我认为 IntentIntegrator 和 IntentResult 的全部意义在于您不必做所有这些,它就像是这些东西的包装器,对吧?
    • 这不是必须的,正确的。您应该只使用 IntentIntegrator。
    【解决方案3】:

    您需要从存储库中获取最新的类 https://github.com/zxing/zxing/tree/master/android-integration/src/main/java/com/google/zxing/integration/android

    查看该类的 javadoc 以了解如何使用它。首先添加代码来调用 Intent:

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

    其次,将此添加到您的 Activity 以处理结果:

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode,      intent);
        if (scanResult != null) {
            // handle scan result
        }
        // else continue with any other code you need in the method
    }
    

    更多信息在这里https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多