2013-07-24 20 views
5

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

Trả lời

9

Cuối cùng tôi đã thành công để tìm ra vấn đề về mã của tôi và nhận giải pháp. Khi tôi cố gắng mở lại máy ảnh theo phương pháp onResume() của tôi, tôi đã bỏ lỡ một phần. Khi tôi tạo/mở một máy ảnh mới trong onResume(), FrameLayout vẫn có máy ảnh trước đó của tôi. Vì vậy, tất cả những gì tôi làm là xóa máy ảnh trước đó của tôi khỏi FrameLayout trên phương thức onPause() và sau đó tạo lại mọi thứ trên phương thức onResume(). Điều đó giải quyết vấn đề của tôi và bây giờ nó đang làm việc độc đáo mà không có bất kỳ lỗi nào. Đây là phương pháp onPause()onResume() của chúng tôi với bản sửa lỗi. Hy vọng điều này có thể giúp ai đó trong tương lai.

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

    } 

Cảm ơn, Sakib

+1

Cảm ơn bạn. nó thực sự giúp tôi. – Drx

+0

u đã lưu thời gian của tôi :) cảm ơn bạn đã chia sẻ mã ur –

Các vấn đề liên quan