如何使用zxing从qr扫描仪捕获数据

时间:2012-09-26 21:39:24

标签: android

我正在开发一个应用程序,其中一部分涉及QR扫描。经过大量的研究,我成功地开发了一个独立的扫描应用程序。当用户打开扫描仪并扫描特定的QR码时,他获得了一些价值,例如一个URL。现在我想将扫描时获得的数据存储到我的android代码中。任何人都可以帮我解决这个问题吗?

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

请帮帮我。

谢谢, Amey

以下是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); 
        } 
    }
}

4 个答案:

答案 0 :(得分:2)

通过意图使用它是最简单的方法,并且可以存储扫描结果,您只需自己完成。它的工作原理完全在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 - 扫描QR码 3 - 从onActivityResult中的扫描中检索信息。

答案 1 :(得分: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);
}

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

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

答案 2 :(得分:2)

我偶然在你的线程上搜索这组代码的帮助。在我的情况下,我不得不将信息发送回主应用程序(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()

在Project 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

希望这有帮助!这是我在这里的第一篇文章,我很高兴我可以贡献=)

答案 3 :(得分: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);

        }
    }