Tôi cần có máy quét QR trong dự án của mình. Tôi sử dụng ZBar để thực hiện nhiệm vụ này. Chủ yếu là tôi đã làm một thay đổi rất nhỏ trên mã ví dụ được đưa ra bởi ZBar git ví dụ để thực hiện công việc. Tôi cần hiển thị kết quả được quét trong trình duyệt (nếu url) hoặc trong hộp thoại (nếu thông tin bình thường).Zbar với Android: Chế độ xem máy ảnh máy quét vẫn không hoạt động và màu đen sau khi hiển thị url trong trình duyệt
Mọi thứ hoạt động tốt với mã của tôi được cung cấp bên dưới trừ khi tôi cố hiển thị url sau khi quét mã qr trong trình duyệt. Khi tôi quay lại ứng dụng của mình từ trình duyệt, chế độ xem máy ảnh chuyển sang màu đen và vẫn không hoạt động. Tôi đã cố gắng lấy lại máy ảnh hoạt động để quét mã qr khác nhưng tôi đã thất bại. Tôi đã cố gắng mở lại máy ảnh trong hàm onResume() của mình nhưng nó gây ra lỗi và bị thoát khỏi ứng dụng một cách mạnh mẽ. Xin hãy giúp tôi về vấn đề đó.
package com.myapp;
import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.webkit.URLUtil;
import android.widget.FrameLayout;
import com.myapp.CameraPreview;
/* Import ZBar Class files */
public class QRScannerActivity extends Activity
{
private Camera mCamera;
private CameraPreview mPreview;
private Handler autoFocusHandler;
ImageScanner scanner;
private boolean barcodeScanned = false;
private boolean previewing = true;
static {
System.loadLibrary("iconv");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.qr_scanner_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
autoFocusHandler = new Handler();
mCamera = getCameraInstance();
/* Instance barcode scanner */
scanner = new ImageScanner();
scanner.setConfig(0, Config.X_DENSITY, 3);
scanner.setConfig(0, Config.Y_DENSITY, 3);
mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);
FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
preview.addView(mPreview);
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
//finish();
}
/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
} catch (Exception e){
}
return c;
}
private void releaseCamera() {
//Toast.makeText(QRScannerActivity.this, "Paused State", Toast.LENGTH_SHORT).show();
if (mCamera != null) {
previewing = false;
mCamera.setPreviewCallback(null);
mPreview.getHolder().removeCallback(mPreview);
mCamera.release();
mCamera = null;
}
}
private Runnable doAutoFocus = new Runnable() {
public void run() {
if (previewing)
mCamera.autoFocus(autoFocusCB);
}
};
PreviewCallback previewCb = new PreviewCallback() {
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);
String QRScannerResult;
if (result != 0) {
previewing = false;
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
SymbolSet syms = scanner.getResults();
for (Symbol sym : syms) {
QRScannerResult = sym.getData();
showResultAction(QRScannerResult);
barcodeScanned = true;
}
}
}
};
// Mimic continuous auto-focusing
AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
autoFocusHandler.postDelayed(doAutoFocus, 1000);
}
};
private void showResultAction(String QRScannerResult){
if (URLUtil.isValidUrl(QRScannerResult)) {
if (barcodeScanned) {
barcodeScanned = false;
mCamera.setPreviewCallback(previewCb);
mCamera.startPreview();
previewing = true;
mCamera.autoFocus(autoFocusCB);
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(QRScannerResult));
startActivity(i);
}else {
new AlertDialog.Builder(this)
.setTitle("QR Data")
.setMessage(QRScannerResult)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (barcodeScanned) {
barcodeScanned = false;
mCamera.setPreviewCallback(previewCb);
mCamera.startPreview();
previewing = true;
mCamera.autoFocus(autoFocusCB);
}
}
})
.show();
}
}
}
Xin cảm ơn trước. Sakib
Cảm ơn bạn. nó thực sự giúp tôi. – Drx
u đã lưu thời gian của tôi :) cảm ơn bạn đã chia sẻ mã ur –