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


我成功地使用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
                }
            }
        }
    }

11852
2018-06-13 13:23


起源



答案:


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

我创建它来包含发送和解析Intent的这些细节,所以你不要拼写错误。例如,没有额外的“com.google.zxing.client.android.SCAN.SCAN_MODE”。


4
2018-06-13 16:13



对不起肖恩,我是菜鸟:导入com.google.zxing.integration.android.IntentIntegrator;因为无法解析com.google而失败。我错过了某处的链接吗?非常感谢。 - Barry
好的,一切正常!对不起,我没有意识到你的意思是在我的应用程序中添加两个完整的类(IntentIntegrator和IntentResult)。最初的计划,使用大约10行代码来调用安装的扫描仪是理想的,如果我能找到一种方法让它工作。那样更新扫描仪=我的应用程序更新,这样我必须手动关注你的更改:(你说的不存在的东西来自 链接  - 你去年参与过的一次谈话。谢谢您的帮助。 - Barry


答案:


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

我创建它来包含发送和解析Intent的这些细节,所以你不要拼写错误。例如,没有额外的“com.google.zxing.client.android.SCAN.SCAN_MODE”。


4
2018-06-13 16:13



对不起肖恩,我是菜鸟:导入com.google.zxing.integration.android.IntentIntegrator;因为无法解析com.google而失败。我错过了某处的链接吗?非常感谢。 - Barry
好的,一切正常!对不起,我没有意识到你的意思是在我的应用程序中添加两个完整的类(IntentIntegrator和IntentResult)。最初的计划,使用大约10行代码来调用安装的扫描仪是理想的,如果我能找到一种方法让它工作。那样更新扫描仪=我的应用程序更新,这样我必须手动关注你的更改:(你说的不存在的东西来自 链接  - 你去年参与过的一次谈话。谢谢您的帮助。 - Barry


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

这里 并复制整个IntentIntegrator类,将其添加到您的应用程序;也去 这里 并将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
      //...
    }

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


10
2018-06-13 17:26



我不确定我理解你的上一条评论。这是您使用提供的集成库后可以复制和粘贴的最少代码量。对不起,它当然不能是0行。您无法使用集成库。但是你会重新编写它的代码,这可能是几十行,当然。但那更多。当然,如果你喜欢那样做 - 重新发明所需代码和复制提供的所需代码之间的区别是什么? - Sean Owen
对不起肖恩,我不是故意抱怨(我可能做过 - 这是漫长的一天,我道歉)。从我之前的答案中复制的原始刺,是几行使用了你的应用程序提供的意图,这本来是完美的。你建议我使用IntentIntegrator这是一个不同的路线,当然它完美无缺。我的第一个黑客是 很近  - 如果我能够在扫描成功后有意释放,我将获得10行的功能,而不是添加500行和2个类。干杯,B - Barry


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

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

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


1
2018-06-13 14:08



对不起阿尔菲,那是 后 问题。在我按下后退键之前,执行永远不会达到'//处理成功扫描'。它似乎是在扫描本身上循环,并且从未将控制权传递回我的代码。 - Barry
您是否只扫描QR码,如代码所示?如果您尝试扫描1D和矩阵,它会一直显示绿点而不会实际扫描任何内容。 - Alfred
使用上面的代码它成功地扫描了QR和EAN13等,但这是我第一次进入zxing,所以任何其他指针都是受欢迎的,但我的主要问题是当它获得好结果时让zxing放手。 - Barry
巴里,我编辑了我的答案,请检查它是否有效.. - Alfred
对不起,没有变化!操作完全相同 - 扫描成功;扫描仪发出哔哔声继续寻找代码,如果我对已经捕获的条形码进行游荡,它会扫描并再次发出哔哔声;我按回 - 两次 - 扫描仪活动关闭,网络浏览器关闭并搜索(正确扫描)结果:< - Barry


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

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


1
2017-10-08 15:00



如果启动CaptureActivity的活动处于横向模式,则会有所帮助。我补充道 android:screenOrientation="landscape" 在清单中的那个活动。这对我有用。 - Christine


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

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

        }
    }

0
2018-06-20 09:16