Zbar mit Android: Das Ansichtsfenster der Scannerkamera bleibt inaktiv und schwarz, nachdem die URL im Browser angezeigt wurde

Ich brauche einen QR-Scanner in meinem Projekt. Ich benutze ZBar für diese Aufgabe. Hauptsächlich habe ich eine kleine Änderung am Beispielcode von ZBar git vorgenommen, um die Arbeit zu erledigen. Ich muss das gescannte Ergebnis in einem Browser (wenn URL) oder in einem Dialogfeld (wenn normale Informationen) anzeigen.

Alles funktioniert gut mit meinem Code, außer wenn ich versuche, die URL nach dem Scannen eines QR-Codes im Browser anzuzeigen. Wenn ich vom Browser aus zu meiner App zurückkehre, wird das Kamera-Ansichtsfenster schwarz und bleibt inaktiv. Ich habe versucht, die Kamera wieder zu aktivieren, um einen anderen QR-Code zu scannen, aber ich bin gescheitert. Ich habe versucht, die Kamera in meiner onResume () -Funktion erneut zu öffnen, aber das verursacht einen Fehler und hat die App gewaltsam beendet. Bitte helfen Sie mir in dieser Angelegenheit.

    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();
                    }

        }
    }

Danke im Voraus. Sakib

Antworten auf die Frage(1)

Ihre Antwort auf die Frage