【问题标题】:how to capture data from qr scanner using zxing如何使用 zxing 从 qr 扫描仪捕获数据
【发布时间】:2016-06-20 17:18:01
【问题描述】:

我正在开发一个应用程序,其中一部分涉及 QR 扫描。经过大量研究,我成功开发了一个独立的扫描应用程序。当用户打开扫描仪并扫描特定的二维码时,他会得到一些价值,例如一个网址。现在我想将扫描获取的数据存储到我的 android 代码中。谁能帮我解决一下?

据我所知,我需要使用 Zxing 的捕获活动类。但是,我不确定到底需要做什么。我在网上阅读的所有博客都指示我使用Intent 调用条形码扫描。但是,我的应用程序的目的不仅仅是扫描产品。我需要存储扫描产品的信息,然后将其用于其他目的。

请帮助我。

谢谢, 艾米

这是来自 Zxing 的代码。这是处理所有扫描的主要活动。根据我通过在线阅读了解到的,我需要捕获扫描条形码时返回的数据..

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (resultCode == RESULT_OK) { 
        if (requestCode == HISTORY_REQUEST_CODE) { 

            int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER, -1); 

            if (itemNumber >= 0) { 
                HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber);             
                decodeOrStoreSavedBitmap(null, historyItem.getResult()); 
            } 
        }
    } 
} 


if (Intents.Scan.ACTION.equals(action)) { // Scan the formats the intent requested, and   return the result to the calling activity 
    source = IntentSource.NATIVE_APP_INTENT; 

    decodeFormats = DecodeFormatManager.parseDecodeFormats(intent); 
    if (intent.hasExtra(Intents.Scan.WIDTH) && intent.hasExtra(Intents.Scan.HEIGHT)) {

        int width = intent.getIntExtra(Intents.Scan.WIDTH, 0); 
        int height = intent.getIntExtra(Intents.Scan.HEIGHT, 0); 

        if (width > 0 && height > 0) { 
            cameraManager.setManualFramingRect(width, height); 
        } 
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    通过意图使用它是最简单的方法,并且可以存储扫描结果,您只需要自己做。它的工作原理都在 Zxing 的文档http://code.google.com/p/zxing/wiki/ScanningViaIntent

    从上面的链接

    首先添加调用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
                //here is where you would get the data from the scanResult
                //and store locally by writing to a file or however you 
                //intend to store it
            }
            // else continue with any other code you need in the method
    }
    

    我没用过这个版本的Zxing,我用的是至少2年前的但是流程是一样的

    1 - 通过 Intent 启动 Zxing 2 - 扫描二维码 3 - 从 onActivityResult 中的扫描中检索信息。

    【讨论】:

    • 嗨 Triggs,如果我理解正确的话,如果我想让我的应用程序启动外部条码扫描应用程序,你在这里讨论的方法是可行的。所以当用户打开我的应用程序时,他会被提示下载另一个条码扫描应用程序.. 我想避免这种情况.. 目前我的应用程序扫描其韩元上的条码,感谢 Zxing!我希望继续使用这种架构,同时打算捕获扫描仪扫描的数据。
    • 啊,我明白了,为了更好地理解您的问题,您能否发布一些代码来显示您遇到的问题?
    • 嗨,这是来自 Zxing 的代码。这是处理所有扫描的主要活动。根据我通过在线阅读了解到的,我需要捕获扫描条形码时返回的数据..
    • public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (resultCode == RESULT_OK) { if (requestCode == HISTORY_REQUEST_CODE) { int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER , -1); if (itemNumber >= 0) { HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber); decodeOrStoreSavedBitmap(null, historyItem.getResult()); } } } }
    • if (Intents.Scan.ACTION.equals(action)) { // 扫描intent请求的格式,并将结果返回给调用activity source = IntentSource.NATIVE_APP_INTENT; decodeFormats = DecodeFormatManager.parseDecodeFormats(intent); if (intent.hasExtra(Intents.Scan.WIDTH) && intent.hasExtra(Intents.Scan.HEIGHT)) { int width = intent.getIntExtra(Intents.Scan.WIDTH, 0); int height = intent.getIntExtra(Intents.Scan.HEIGHT, 0); if (width > 0 && height > 0) { cameraManager.setManualFramingRect(width, height); } }
    【解决方案2】:

    您好,我终于找到了这个问题的答案。并没有我想的那么难(因为 Zxings 的代码是 Zxing 团队写的,不是我写的……反正……)

    因此,如果您想将 qr 扫描仪(由 Zxing 提供)捕获的数据存储在您的 android 代码中(无论出于何种目的......在我的情况下,我想将此数据发送到 Web 服务器......无论如何......)然后您只需要修改以下函数..这里是您获得扫描活动结果的地方..

    public void handleDecode(Result rawResult, Bitmap barcode) {
    inactivityTimer.onActivity();
    lastResult = rawResult;
    Log.d("last result", "checking if raw result is what i expect");
    System.out.println(lastResult);
    ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult);
    historyManager.addHistoryItem(rawResult, resultHandler);
    }
    

    我添加了日志和打印语句来检查我是否得到了正确的结果。是的,它确实给了我一个正确的答案.. 你可以在 CaptureActivity 类中找到它。

    @triggs:感谢您的帮助!你确实让我走上了正轨:-)

    【讨论】:

      【解决方案3】:

      我偶然发现您的线程也在寻找有关这组代码的帮助。在我的情况下,我必须将信息发送回主应用程序(ZXing 是我项目中的一个库 - 我知道,我已经与我的客户讨论过这个问题,但由于业务需求我们无法使用 Intents)。

      如果您需要将信息从另一个项目传回另一个活动,这是我的解决方案。

      项目 A 是主要应用程序,而 ZXing 项目将被这样调用。

      编辑ZXing的CaptureActivity.java中的handleDecode():

      public void handleDecode(Result rawResult, Bitmap barcode) {
          inactivityTimer.onActivity();
          lastResult = rawResult;
          ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult); 
      if (source == IntentSource.NATIVE_APP_INTENT) {
              Intent resultIntent = new Intent();
              resultIntent.putExtra("result", rawResult.toString());
              setResult(Activity.RESULT_OK, resultIntent);
              finish();
          } 
      
      }//end handleDecode()
      

      在您的项目 A 的调用 CaptureActivity 的活动中,

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent intent) {
          NullQRCodeDialogFragment dialog = new NullQRCodeDialogFragment();
          String result = "";
              if (resultCode == RESULT_OK) {
                  result = intent.getStringExtra("result");
                   if (result.equals(null)){
                        //TODO
                   } else {
                        //TODO
                   }
      }//end onActivityResult
      

      希望这会有所帮助!这是我在这里的第一篇文章,我很高兴我能做出贡献 =)

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          最近更新 更多