2012-09-26 50 views
0

我正在開發一個應用程序,其中一部分涉及QR掃描。經過大量研究,我成功開發了獨立掃描應用程序。當用戶打開掃描儀並掃描特定的QR碼時,他會得到一些值,例如,一個URL。現在我想將掃描獲得的數據存儲到我的android代碼中。任何人都可以幫我解決問題嗎?如何從qr掃描儀使用zxing捕獲數據

從我所看到的,我需要使用Zxing的捕獲活動類。但是,我不確定究竟需要做什麼。我在線閱讀的所有博客都指示我使用Intent來調用條形碼掃描。但是,我的應用程序的目的不是僅僅掃描產品。我需要存儲掃描產品的信息,並稍後將其用於其他目的。

請幫助我。

感謝, Amey

下面是從斑馬線代碼..這是與所有的掃描涉及的主要活動。什麼事情讓我通過網上閱讀了解到,我需要捕捉,當條形碼掃描返回的數據..通過意向

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

回答

2

嗨我終於找到了這個問題的答案。這並不是說困難,因爲我認爲(因爲Zxings代碼已經寫了斑馬線的團隊,而不是由我..反正..)

所以,如果你想存儲的QR掃描(通過斑馬線提供)捕獲的數據你的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:謝謝你的幫助!你沒讓我在正確的軌道:-)

2

使用它是最簡單的方式,它可以將結果存儲掃描的,你只需要自己做。所有在斑馬線的文檔工作原理是在http://code.google.com/p/zxing/wiki/ScanningViaIntent

從上面的鏈接

首先添加代碼來調用意圖:

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

其次,這種添加到您的活動來處理結果:

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 
} 

我沒有用過這個版本的斑馬線,我至少是2年前所使用的,但過程是相同的

1 - 經由意圖 2開始斑馬線 - 掃描的QR碼 3 - 檢索在onActivityResult掃描的信息。

+0

嗨Triggs,如果我理解正確的話,你已經在這裏討論的方法是可行的,如果我想我的應用程序啓動外部條形碼掃描應用程序..所以當用戶打開我的應用程序,他西港島線提示下載另一個條形碼掃描應用程序..我想避免這..目前我的應用程序掃描它的韓元條碼,感謝Zxing!我希望繼續這一架構,同時打算捕獲掃描儀掃描的數據。 – user1701593

+0

啊我看到,爲了更好地理解你的問題,你可以發佈一些代碼來顯示你遇到的問題? – triggs

+0

嗨,這裏是Zxing的代碼..這是處理所有掃描的主要活動。我想通過在線閱讀,我需要捕獲條碼掃描時返回的數據。 – user1701593

2

我遇到了你的線程搜索與這組代碼有所幫助。在我的情況下,我不得不將信息發回主應用程序(ZXing是我項目中的一個庫 - 我知道,我已經與客戶討論過這個問題,但由於業務需求,我們無法使用Intents。

這是我的解決方案,如果您需要將信息傳遞迴另一個項目的另一個活動。

項目A是主要的應用程序,而ZXing項目將被這樣調用。

編輯handleDecode()在斑馬線的CaptureActivity.java:

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

而在這呼喚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 

希望這有助於!這是我在這裏的第一篇文章,我很高興我可以貢獻=)

+0

感謝Maya對您提供的幫助!我投了你的答案 – user1701593

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

     } 
    }