2013-07-24 25 views
5

Projemde bir QR tarayıcım olması gerekiyor. Bu görevi yapmak için ZBar kullanıyorum. Temelde, işi yapmak için ZBar git örneğinin verdiği örnek kodda çok küçük bir değişiklik yaptım. Taranan sonucun bir tarayıcıda (url varsa) veya bir iletişim kutusunda (normal bilgilerde) gösterilmesi gerekir. Tarayıcımda bir qr kodu tarandıktan sonra URL'yi göstermeye çalışmazsa, kodumla birlikte iyi çalışan her şey aşağıdaki gibi görünüyor. Uygulamamı tarayıcıdan geri döndüğümde kamera görüntü alanı siyahlaşıyor ve etkin değil. Başka bir qr kodunu taramak için kamerayı aktif duruma getirmeye çalıştım ama başarısız oldum. OnResume() işlevindeki kamerayı yeniden açmayı denedim, ancak bu hataya neden oluyor ve uygulamadan zorla çıkılıyor. Lütfen bu konuda bana yardımcı olun.Android ile Zbar: Tarayıcı kamera viewport, tarayıcıda URL'yi gösterdikten sonra etkin değil ve siyah kalıyor

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

     } 
    } 

Şimdiden teşekkürler. Sakib

cevap

9

Sonunda kodumun problemini çözmeyi başardım ve çözümü aldım. Kamerayı onResume() yöntemimde tekrar açmaya çalıştığımda bir parçayı kaçırdım. onResume()'da yeni bir kamera oluşturduğumda/açtığımda, FrameLayout hala önceki kameramda. Yani tek yaptığım önceki kameramı FrameLayout'tan onPause() yöntemiyle kaldırmak ve sonra onResume() yönteminde her şeyi yeniden oluşturmaktır. Bu benim problemimi çözüyor ve şimdi hiçbir hata olmadan güzel çalışıyor. İşte benim düzeltme ile onPause() ve onResume() yöntemidir. Umarım bu, gelecekte birilerine yardım edebilir.

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

    } 

sayesinde Sakib

+1

teşekkür ederiz. gerçekten bana yardım ediyor. – Drx

+0

u zamanımı kurtardım :) ur kodunu paylaştığınız için teşekkürler –

İlgili konular