ここ数週間、私は Zxing を変更して、スキャン後すぐに写真を撮ろうと試みてきました。おかげで、PreviewCallback.java 内の onPreviewFrame クラスから一貫して画像を保存できるようになりました。
onPreviewMethod メソッド内で使用するコードが続き、その後、アプリのしくみを簡単に説明します。
public void onPreviewFrame(byte[] data, Camera camera) {
Point cameraResolution = configManager.getCameraResolution();
Handler thePreviewHandler = previewHandler;
android.hardware.Camera.Parameters parameters = camera.getParameters();
android.hardware.Camera.Size size = parameters.getPreviewSize();
int height = size.height;
int width = size.width;
System.out.println("HEIGHT IS" + height);
System.out.println("WIDTH IS" + width);
if (cameraResolution != null && thePreviewHandler != null) {
YuvImage im = new YuvImage(data, ImageFormat.NV21, width,
height, null);
Rect r = new Rect(0, 0, width, height);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
im.compressToJpeg(r, 50, baos);
try {
FileOutputStream output = new FileOutputStream("/sdcard/test_jpg.jpg");
output.write(baos.toByteArray());
output.flush();
output.close();
System.out.println("Attempting to save file");
System.out.println(data);
} catch (FileNotFoundException e) {
System.out.println("Saving to file failed");
} catch (IOException e) {
System.out.println("Saving to file failed");
}
Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x,
cameraResolution.y, data);
message.sendToTarget();
previewHandler = null;
} else {
Log.d(TAG, "Got preview callback, but no handler or resolution available");
}}
私のアプリケーションは独自の GUI と機能を中心にしていますが、インテントを介して Zxing を使用できます (Zxing はアプリのビルド パスに組み込まれています。Zxing が既にインストールされている場合に干渉する可能性があるため、これは悪いことです)。Zxing が QR コードをスキャンすると、コード化された情報がアプリに返されて保存され、少し遅れて Zxing が自動的に再開されます。
私の現在のコードは、Zxing の実行中にフレームごとに画像を保存します。私が望む機能は、スキャン中のフレームのみを保存することです。Zxing は、アプリが再び引き継がれる短いウィンドウで画像の保存を停止しますが、Zxing はすぐに再初期化され、データを操作する時間がない場合があります。ただし、可能な回避策は、保存されたファイルの名前をすばやく変更して、Zxing が上書きを開始せず、バックグラウンドで操作を実行できるようにすることです。それでも、フレームごとに画像を保存することは、リソースの浪費であり、あまり好ましくありません。
スキャン時にのみ画像を保存するにはどうすればよいですか?
前もって感謝します。
要求に応じて multiFormatReader の見つかったインスタンスを表示するように更新されました。
private final CaptureActivity activity;
private final MultiFormatReader multiFormatReader;
private boolean running = true;
DecodeHandler(CaptureActivity activity, Map<DecodeHintType,Object> hints) {
multiFormatReader = new MultiFormatReader();
multiFormatReader.setHints(hints);
this.activity = activity;
}
@Override
public void handleMessage(Message message) {
if (!running) {
return;
}
if (message.what == R.id.decode) {
decode((byte[]) message.obj, message.arg1, message.arg2);
} else if (message.what == R.id.quit) {
running = false;
Looper.myLooper().quit();
}}
private void decode(byte[] data, int width, int height) {
long start = System.currentTimeMillis();
Result rawResult = null;
PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
if (source != null) {
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
//here?
try {
rawResult = multiFormatReader.decodeWithState(bitmap);
} catch (ReaderException re) {
// continue
} finally {
multiFormatReader.reset();
}
}