2016-10-03 3 views
1

Ich benutze die Android Google Barcode Vision API und ich kann meinen QR-Code perfekt erkennen. Wie kann ich die Taschenlampe zur gleichen Zeit einschalten? Es wird erforderlich sein, einen QR-Code nachts zu scannen. Hier ist der Arbeits Code Ich habe bisherAndroid google mobile Vision api einschalten Kamera und Taschenlampe

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

    } 
} 

Alles funktioniert perfekt Ich kann einfach nicht herausfinden, wie die Fackel drehen richtig und immer noch die mobile Vision api verwenden. Jede Hilfe oder Vorschläge würde sehr geschätzt werden.

Antwort

3

Hier ist meine voll funktionsfähige Lösung. Durch Aufnahme der CameraSource.java Klasse found here in mein Projekt. Ich kann den QR-Code scannen und ich kann den Kamerabrenner ein- und ausschalten.

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

    } 
} 

Ich bin sicher, dass es eine saubere Lösung ist aber jetzt dieser Code funktioniert perfekt und mit Autofokus auf true gesetzt ist, ist wirklich cool, wie schnell und einfach es ist, den QR-Code zu scannen. Selbst aus 3 Metern Entfernung wird der Code sofort erkannt.

+0

Hallo, hast du die CameraSource-Klasse explizit in dein Projekt aufgenommen? – mydreamadsl

+0

Ja, ich tat .......... –

+0

Danke, das hat perfekt funktioniert – mydreamadsl

Verwandte Themen