android:zxing条形码扫描成功但不从活动返回

时间:2012-06-13 13:23:18

标签: android zxing barcode-scanner

我成功地使用zxing来扫描代码,通过调用已安装的条形码阅读器的意图,但是当它发出哔哔声并指示良好的扫描时,我希望zxing活动会返回控制权以便我可以处理结果,但它会坐在那里并尝试再次扫描。我必须按下后退按钮然后然后它返回,我可以执行下一步。当我打电话给扫描仪时,是否有一些明显的标志?

感激地收到任何建议。非常感谢。

这是我的代码:

public boolean onTouchEvent(final MotionEvent event) {

    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.putExtra("com.google.zxing.client.android.SCAN.SCAN_MODE", "QR_CODE_MODE");
    startActivityForResult(intent, 0);

    return true;
    }

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");

            // Handle successful scan

            String s = "http://www.google.com/search?q=";
            s += contents;
            Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s));
            startActivity(myIntent1);
            }
        else 
            if (resultCode == RESULT_CANCELED) {
                // Handle cancel
                }
            }
        }
    }

5 个答案:

答案 0 :(得分:10)

这是我自己问题的完整答案,希望这有助于某人:

转到here并复制整个IntentIntegrator类,将其添加到您的应用中;也转到here并将IntentResult类复制到您的应用程序。现在将其添加到您的活动中(或通过按钮/其他任何方式触发扫描):

public boolean onTouchEvent(final MotionEvent event) {

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

    return true;
    }

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
      IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
      if (scanResult != null) {
        // handle scan result
          String s = "http://www.google.com/search?q=";
            s += scanResult.getContents();

            Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s));
            startActivity(myIntent1);
      }
      // else continue with any other code you need in the method
      //...
    }

如果只是调用条形码扫描仪应用程序提供的服务而不是将代码块复制并粘贴到您自己的应用程序中,那将会很棒,但这似乎是推荐的方式:(

答案 1 :(得分:5)

为什么不使用提供的IntentIntegrator课程?这是项目文档中提到的唯一方法,你看过那些吗? https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

我创建它以包含发送和解析Intent的这些细节,因此您不会进行拼写错误。例如,没有额外的" com.google.zxing.client.android.SCAN.SCAN_MODE"。

答案 2 :(得分:1)

添加finishActivity(requestCode);在onActivityResult()方法的最后。

试试这个: 使用以下代码替换onTouch中的前两行。似乎问题是扫描QR以外的代码。请删除扫描过滤器并检查一次。

Intent intent = new Intent(“com.google.zxing.client.android.SCAN”); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

答案 3 :(得分:1)

我遇到了同样的问题所以我尝试使用Sean Owen推荐的IntentIntegrator类。直到我意识到这只是在尝试以纵向扫描条形码时(最常见的是在手机上),我仍然遇到了问题。事实证明,从纵向到横向的方向变化会导致双重扫描。我通过将android:configChanges="orientation|keyboardHidden|screenSize"添加到清单中的活动来解决此问题。你可能只需要一个方向,但这是未经测试的。

对于在创建Adobe AIR Native Extension时遇到此问题的任何用户,请确保不仅将该行添加到您的Android项目清单中,还要添加到app.xml中的android manifest添加内容中的activity标记。

答案 4 :(得分:0)

这是我正在使用的解决方案。它对我来说很好。

Intent intent = new Intent(SelectOptionActivity.this, CaptureActivity.class);
                intent.putExtra("SCAN_MODE", "ONE_D_MODE");
                intent.putExtra("SCAN_FORMATS", "CODE_39,CODE_93,CODE_128,DATA_MATRIX,ITF,CODABAR,EAN_13,EAN_8,UPC_A,QR_CODE");
                intent.setAction(Intents.Scan.ACTION);
                startActivityForResult(intent, 1);


public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 1 && resultCode == RESULT_OK) {
            final String contents = intent.getStringExtra(Intents.Scan.RESULT);
            final String formatName = intent.getStringExtra(Intents.Scan.RESULT_FORMAT);

        }
    }