Android開発の仕事にはついていないのですが、
仕事があまりにもひm…勉強兼ねて、
先輩にお題を出してもらってAndroidアプリを作ってました。
……同じこと6年前も言ったぞ?そのときもZxingだったぞ?
6年前とは使い方とかちょっと変わってるみたいなので、
自分用にメモを残しておきます。
今回はカメラのキャプチャのJAN-13とQRコードを読み取りたかったです。
/**
* カメラプレビューのキャプチャ取得時のコールバック
*/
private Camera.PreviewCallback pictureListener = new Camera.PreviewCallback() {
// データ生成完了
public void onPreviewFrame(byte[] data, Camera camera) {
try {
if (data != null) {
Camera.Size size = camera.getParameters().getPreviewSize();
// Zxingは一次元バーコードを一方向しかサポートしていないため
// 失敗した場合には90度回転して2度試す
if (!DecodeAndSend(data, size, false)) {
DecodeAndSend(data, size, true);
}
// プレビューを再開する
StartPreviewAndAutoFocus();
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
/**
* バーコード解析
*
* @param data YUVのByte配列
* @param size カメラサイズ
* @param bIsRoll 90度回転するか
* @return 送信まで完了していればtrue
*/
private boolean DecodeAndSend(byte[] data, Camera.Size size, boolean bIsRoll) {
boolean ret = false;
Result result = null;
try {
BinaryBitmap binaryBmp = null;
if (bIsRoll) {
// YUVをBitmap化
YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21,
size.width, size.height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, baos);
byte[] jdata = baos.toByteArray();
BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options();
bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length, bitmapFatoryOptions);
// Bitmapを90度回転
Matrix mat = new Matrix();
mat.postRotate(90);
Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, size.width, size.height, mat, true);
int width = bmp.getWidth();
int height = bmp.getHeight();
int[] pixels = new int[width * height];
bmp.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
binaryBmp = new BinaryBitmap(new HybridBinarizer(source));
} else {
PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
data, size.width, size.height, 0, 0, size.width, size.height, false);
binaryBmp = new BinaryBitmap(new HybridBinarizer(source));
}
Reader reader = new MultiFormatReader();
Log.d("decode Success : ", reader.decode(binaryBmp).getText());
ret = true;
} catch (NotFoundException eNotFound) {
// バーコードが見つからない
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
実際はLog.dのところでシャッター音鳴らしたり、読取り結果を暗号化したり、Bluetooth通信したりしてますが、今回はあくまでZxingのとこだけ。
他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。
1件のコメント