2016-08-02 159 views
-2

我正在研究涉及掃描條形碼的應用程序。到目前爲止,我已經成功使用相機預覽按照以下方式掃描條形碼。鏈接https://github.com/ZBar/ZBar使用zbar掃描條形碼圖像?

但是,它的工作方式並不能真正滿足我的需求。該示例使用相機預覽。但是在我的項目應用程序中,我有一個允許用戶通過點擊按鈕(Intent)訪問攝像機的應用程序。

之後,它將捕獲的圖像轉換爲字節數組。

是否有反正使用啓用Zbar掃描圖像(字節數組)而不是?或者有沒有反過來使用Zbar與Android的相機,而不是相機預覽?

謝謝。

這是我的MainActivity.java,它允許用戶通過意圖訪問攝像頭。

public class MainActivity extends Activity { 

Button cameraBtn; 
final int REQUEST_IMAGE_CAPTURE = 1; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    cameraBtn = (Button)findViewById(R.id.cameraBtn); 

    cameraBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); 
     } 
    }); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     Bundle extras = data.getExtras(); 
     Bitmap imageBitmap = (Bitmap) extras.get("data"); 
    } 
}} 

回答

0

Zbar庫使您的工作在繼承所有的相機功能更容易。不過,您仍然可以使用Zbar api創建自己的Camera/CameraPreview掃描條形碼。

下面的代碼片段說明了Zbar如何掃描每個幀的條形碼。 onPreviewFrame回調爲您提供了由相機捕獲的每個幀。

public void onPreviewFrame(byte[] data, Camera camera) { 
      Camera.Parameters parameters = camera.getParameters(); 
      Size size = parameters.getPreviewSize(); 

      Image barcode = new Image(size.width, size.height, "Y800"); 
      barcode.setData(data); 

      int result = scanner.scanImage(barcode); 
      if (result != 0) { 
       SymbolSet syms = scanner.getResults(); 
       for (Symbol sym : syms) { 
        Log.v("", sym.getData()); 
       } 
      } 
} 

在這裏,你需要建立一個覆蓋onPreviewFrame callabck自己的相機活動。此外,您需要加載iconv庫(Zlib的一部分),實例化Scanner實例。

static { 
    System.loadLibrary("iconv"); 
} 

ImageScanner scanner = new ImageScanner(); 
scanner.setConfig(0, Config.X_DENSITY, 3); 
scanner.setConfig(0, Config.Y_DENSITY, 3);