今、zxingを使用してQRコード読み込みの処理を開発しています。
一つのQRコードは(
http://s.journal.mycom.co.jp/column/tool/036/index.htmlを参考にし
て)
読み込めたのですが、複数のQRコード(例:車検証についている分割されているQRコード)を読む込む
事が出来ません。
どのように出来ていないかと言うと、eclipse上のデバッグ上での確認ですが、
一つ目のQRコードを読み込んだ時にbinaryBitmapをデコードしたデータを見ると、
このQRコードは連結モードのQRコードで1番目のQRコードです。というデータが読み取れないのです。
(
ftp://ftp.software.ibm.com/printers/downloads/jp/manual/pdf/
ip1000jpagesnewbarcodecmdexr11.pdfに1バイト目は
連結モードを表す識別子、2、3バイト目は何番目かを表すもの、4、5バイト目は分割数と書いてありましので。。)
どうしても1バイト目が“48”だったり“49”だったりします。
2、3バイト目もpdfに書いてあるようなデータにはなってくれないのです。
zxingを使用して連結モードのQRコードを読み込む事は行えないのでしょうか?
また行える場合、どのようにすればよいのか、ご教授頂けないでしょうか?
以下に今、実装しているソースコードを貼り付けます。
-------------------------------------------------
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Hashtable;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.multi.ByQuadrantReader;
import com.google.zxing.multi.qrcode.QRCodeMultiReader;
import com.google.zxing.qrcode.QRCodeReader;
import com.XXXXXXXXX.RGBLuminanceSource;
import com.google.zxing.qrcode.decoder.*;
import com.google.zxing.qrcode.encoder.QRCode;
import com.google.zxing.qrcode.QRCodeReader;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
public class QRLoaderActivity extends Activity {
Preview preview; // カメラプレビュー
Button btnTakeQr; // 撮影ボタン
Button btnReturn; // 戻るボタン
public static final String TAG = "XXXXXXXXXXXX";
public static QRLoaderActivity instance;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.qr_take_photo);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
preview = new Preview(this);
((FrameLayout) findViewById(R.id.previewqr)).addView(preview);
btnTakeQr = (Button)findViewById(
R.id.tk);
btnTakeQr.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
autoFocus();
//preview.camera.takePicture(shutterCallback, rawCallback,
jpegCallback);
try {
Thread.currentThread();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
btnReturn = (Button)findViewById(R.id.Return);
btnReturn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
MakerActivity.class);
if (preview.camera != null) {
preview.camera.setPreviewCallback(null);
preview.camera.stopPreview();
preview.camera.release();
preview.camera = null;
}
QRLoaderActivity.instance.finish();
startActivity(intent);
}
});
}
public void autoFocus(){
if(preview.camera != null){
preview.camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
camera.autoFocus(null);
camera.stopPreview();
Thread trd = new Thread(new Runnable(){
public void run() {
try{
Thread.sleep(1000);
}catch(Exception e){
}
preview.camera.takePicture(shutterCallback, rawCallback,
mPictureListener);
};
});
trd.start();
}
});
}
}
ShutterCallback shutterCallback = new ShutterCallback(){
@Override
public void onShutter() {
Log.d(TAG, "onShutter'd");
}
};
PictureCallback rawCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken - raw");
}
};
PictureCallback mPictureListener = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Reader reader = new MultiFormatReader();
Result result = null;
BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
opts);
LuminanceSource source = new RGBLuminanceSource(bitmap);
BinaryBitmap binaryBitmap = new BinaryBitmap(new
HybridBinarizer(source));
try {
result = reader.decode(binaryBitmap);
byte[] c = result.getRawBytes();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
}
};
}
-------------------------------------------------
宜しくお願いします。