【问题标题】:android: zxing barcode scan successful but not returning from activityandroid:zxing 条码扫描成功但未从活动返回
【发布时间】:2012-06-13 13:23:17
【问题描述】:

我通过调用已安装的条形码阅读器的意图成功地使用 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
                }
            }
        }
    }

【问题讨论】:

    标签: android zxing barcode-scanner


    【解决方案1】:

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

    转到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
          //...
        }
    

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

    【讨论】:

    • 我不确定我是否理解您的最后评论。这是您可以复制和粘贴的最少代码量,因为您使用的是提供的集成库。抱歉,当然不能是 0 行。您不能使用集成库。但是你会重新编写它的代码,这可能是几十行,当然。但这还不止。当然,如果您愿意,可以这样做——重新发明所需的代码和复制提供的所需代码有什么区别?
    • 对不起,肖恩,我不是故意发牢骚的(虽然我可能发了 - 这是漫长的一天,我道歉)。我的原始 stab 是从此处较早的答案复制而来的,其中几行使用了您的应用程序提供的意图,这将是完美的。您建议我使用 IntentIntegrator,这是一条不同的路线,当然它可以完美运行。我的第一个 hack 非常接近 - 如果我能在成功扫描后让您发布的意图,我会在 10 行中获得功能,而不是添加 500 行和两个类。干杯,B。
    • 你能查一下我的question相关吗?
    【解决方案2】:

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

    我创建它是为了总结发送和解析 Intent 的这些细节,所以你不会打错字。例如,没有额外的“com.google.zxing.client.android.SCAN.SCAN_MODE”。

    【讨论】:

    • 对不起肖恩,我是菜鸟:import com.google.zxing.integration.android.IntentIntegrator;由于 com.google 无法解决而失败。我在某处缺少链接吗?非常感谢。
    • 好的,一切正常!抱歉,我没有意识到您的意思是向我的应用程序添加两个完整的类(IntentIntegrator 和 IntentResult)。最初的计划是使用大约 10 行代码来调用已安装的扫描仪,如果我能找到一种方法让它工作的话,那是最理想的。这样扫描仪的更新=我的应用程序的更新,这样我必须手动关注您的更改:(您所说的不存在来自link-您去年参与的对话. 感谢您的帮助。
    【解决方案3】:

    添加finishActivity(requestCode);在 onActivityResult() 方法的末尾。

    试试这个: 将 onTouch 中的前 2 行替换为以下代码。似乎问题出在扫描二维码以外的代码时。请移除扫描过滤器并检查一次。

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

    【讨论】:

    • 对不起,Alfi,这是问题之后。在我按下返回键之前,执行永远不会达到“//处理成功扫描”。它似乎在循环扫描本身,并且根本没有将控制权交还给我的代码。
    • 您是否只扫描二维码,如您的代码所示?如果您尝试扫描一维和矩阵,它会一直显示绿点而不实际扫描任何内容。
    • 使用上面的代码,它成功扫描了 QR 和 EAN13 等,但这是我第一次接触 zxing,所以欢迎任何其他指针,但我的主要问题是让 zxing 在它变得很好时放手结果。
    • 对不起,没有变化!操作完全相同 - 成功扫描;扫描仪发出哔哔声;继续寻找代码,如果我徘徊在已经捕获的条形码上,它会扫描它并再次发出哔哔声;我按回 - 两次 - 扫描仪活动关闭,网络浏览器关闭并用谷歌搜索(正确扫描)结果:
    【解决方案4】:

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

    对于在创建 Adob​​e AIR 原生扩展时遇到此问题的任何用户,请务必将该行不仅添加到您的 android 项目清单中,而且还要添加到 app.xml 中的 android 清单添加中的活动标记中。

    【讨论】:

    • 如果您启动 CaptureActivity 的活动处于横向模式,这会有所帮助。我在清单中的该活动中添加了android:screenOrientation="landscape"。这对我有用。
    【解决方案5】:

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

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

    【讨论】:

    • 如何将结果从前一个表单返回到第二个活动?
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 2022-07-22
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多