2016-10-03 118 views
1

我使用android谷歌條碼視覺API,我可以完美地檢測我的QR碼。我怎樣才能同時打開火炬。它需要在晚上掃描二維碼。這裏是工作的代碼我到目前爲止Android谷歌手機視覺api打開相機和手電筒

public class fragment_qrscan extends myFragment { 

    SurfaceView cameraPreview; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_qrscan, container, false); 

     cameraPreview = (SurfaceView)view.findViewById(R.id.camera_preview); 

     createCameraSource(); 

     return view; 
    } 


    private void createCameraSource() { 

     BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(getActivity()).build(); 
     final CameraSource cameraSource = new CameraSource.Builder(getActivity(),barcodeDetector) 
       .setAutoFocusEnabled(true) 
       .setRequestedPreviewSize(1600,1024) 
       .build(); 

     cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() { 
      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 
       try { 
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
         ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1); 
        } 

        cameraSource.start(cameraPreview.getHolder()); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

      } 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 

       cameraSource.stop(); 
      } 
     }); 

     barcodeDetector.setProcessor(new Detector.Processor<Barcode>() { 
      @Override 
      public void release() { 

      } 

      @Override 
      public void receiveDetections(Detector.Detections<Barcode> detections) { 

       final SparseArray<Barcode> barcodes = detections.getDetectedItems(); 
       if (barcodes.size() >0) { 
        Log.i("myStuff",String.valueOf(barcodes.valueAt(0).displayValue)); 
       } 
      } 
     }); 

    } 
} 

一切工作完美我只是無法弄清楚如何正確地打開了手電筒,仍然使用移動視覺API。任何幫助或建議將不勝感激。

回答

3

這是我完全可行的解決方案。在我的項目中包含CameraSource.java類found here。我可以掃描二維碼,並且可以打開和關閉相機手電筒。

public class fragment_qrscan extends myFragment { 

    SurfaceView cameraPreview; 
    private CameraSource mCameraSource; 
    private Button btnLight; 
    boolean lightOn = false; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_qrscan, container, false); 

     cameraPreview = (SurfaceView) view.findViewById(R.id.camera_preview); 
     btnLight = (Button) view.findViewById(R.id.btnLight); 

     btnLight.setOnClickListener(
       new View.OnClickListener() { 
        public void onClick(View v) { 
         btnLightClicked(); 
        } 
       } 
     ); 

     createCameraSource(true, false); 

     return view; 
    } 

    private void btnLightClicked() { 

     if (!lightOn) { 
      mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
      lightOn = true; 

     } 
     else { 
      mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
      lightOn = false; 
     } 
    } 

    @SuppressLint("InlinedApi") 
    private void createCameraSource(boolean autoFocus, boolean useFlash) { 
     Context context = getActivity().getApplicationContext(); 
     BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build(); 
     CameraSource.Builder builder = new CameraSource.Builder(getActivity().getApplicationContext(), barcodeDetector) 
       .setFacing(CameraSource.CAMERA_FACING_BACK) 
       .setRequestedPreviewSize(1600, 1024) 
       .setRequestedFps(15.0f); 
     // make sure that auto focus is an available option 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
      builder = builder.setFocusMode(
        autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null); 
     } 

     mCameraSource = builder 
       .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null) 
       .build(); 

    cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      try { 
       if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1); 
       } 

       mCameraSource.start(cameraPreview.getHolder()); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 

      mCameraSource.stop(); 
     } 
    }); 

    barcodeDetector.setProcessor(new Detector.Processor<Barcode>() { 
     @Override 
     public void release() { 

     } 

     @Override 
     public void receiveDetections(Detector.Detections<Barcode> detections) { 

      final SparseArray<Barcode> barcodes = detections.getDetectedItems(); 
      if (barcodes.size() >0) { 
       Log.i("myStuff",String.valueOf(barcodes.valueAt(0).displayValue)); 
      } 
     } 
    }); 

    } 
} 

我肯定有一個清潔的解決方案,但現在這個代碼工作完美,並設置爲true是自動對焦是真的很酷它是如何快速,方便掃描QR碼。即使在3英尺以外,代碼也能立即被檢測到。

+0

嗨,你包括CameraSource類明確在你的項目? – mydreamadsl

+0

是的,我做了.......... –

+0

謝謝,完美的工作 – mydreamadsl