2013-07-24 13 views
5

Ich brauche einen QR-Scanner in meinem Projekt. Ich benutze ZBar für diese Aufgabe. Hauptsächlich habe ich eine sehr kleine Änderung am Beispielcode gemacht, der von ZBar Git gegeben wurde, um den Job zu machen. Ich muss das gescannte Ergebnis in einem Browser (wenn URL) oder in einem Dialog (wenn normale Informationen) zeigen.Zbar mit Android: Scanner Kamera Ansichtsfenster bleiben inaktiv und schwarz nach dem Anzeigen der URL im Browser

Alles funktioniert gut mit meinem Code unten gegeben, außer wenn ich versuche, die URL nach dem Scannen eines QR-Codes im Browser zu zeigen. Wenn ich über den Browser zu meiner App zurückkehre, wird das Kamerafenster schwarz und bleibt inaktiv. Ich versuchte, die Kamera wieder aktiv zu bekommen, um einen anderen QR-Code zu scannen, aber ich scheiterte. Ich habe versucht, die Kamera in meiner onResume() - Funktion wieder zu öffnen, aber das verursacht einen Fehler und erzwungenes Verlassen der App. Bitte helfen Sie mir zu diesem Thema.

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

     } 
    } 

Vielen Dank im Voraus. Sakib

Antwort

9

Endlich gelang es mir, das Problem meines Codes herauszufinden und die Lösung zu bekommen. Wenn ich versuche, die Kamera in meiner onResume() Methode wieder zu öffnen, habe ich einen Teil verpasst. Wenn ich eine neue Kamera in onResume() erstelle/öffne, hat das FrameLayout immer noch meine vorherige Kamera. Alles, was ich mache, ist, meine vorherige Kamera von FrameLayout auf onPause() Methode zu entfernen und dann alles auf onResume() Methode neu zu erstellen. Das löst mein Problem und jetzt funktioniert es gut und ohne Fehler. Hier ist meine onPause() und onResume() Methode mit dem Fix. Hoffe, dass dies jemandem in Zukunft helfen könnte.

public void onPause() { 
     super.onPause(); 
     releaseCamera(); 
     FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview); 
     preview.removeView(mPreview); 
    } 

    public void onResume(){ 
     super.onResume(); 

     try { 
      if(mCamera==null){ 

      //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      autoFocusHandler = new Handler(); 
      mCamera = getCameraInstance(); 
      this.getWindowManager().getDefaultDisplay().getRotation(); 

      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); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 

     } 
    } 

    /** 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; 
      mPreview= null; 
     } 

    } 

Danke, Sakib

+1

Danke. Es hilft mir wirklich. – Drx

+0

Du hast meine Zeit gerettet :) Danke, dass du deinen Code geteilt hast –

Verwandte Themen