Ho bisogno di avere uno scanner QR nel mio progetto. Io uso ZBar per fare questo compito. Principalmente ho fatto una piccola modifica sul codice di esempio dato da ZBar git esempio per fare il lavoro. Devo mostrare il risultato scansionato in un browser (se url) o in una finestra di dialogo (se informazioni normali).Zbar con Android: lo scanner camera viewport rimane inattivo e nero dopo aver visualizzato l'URL nel browser
Ogni cosa funziona bene con il mio codice dato sotto, tranne se provo a mostrare l'url dopo la scansione di un codice qr nel browser. Quando torno alla mia app dal browser, la vista della telecamera diventa nera e rimane inattiva. Ho provato a riavviare la videocamera per scansionare un altro codice QR ma non sono riuscito. Ho provato a riaprire la fotocamera nella mia funzione onResume() ma questo causa errori e viene forzatamente chiuso dall'app. Per favore aiutami su quel problema.
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();
}
}
}
Grazie in anticipo. Sakib
Grazie. mi aiuta davvero. – Drx
mi hai salvato tempo :) grazie per aver condiviso il tuo codice –