15

Sto cercando di ottenere un fotogramma di anteprima per la funzionalità di scansione del codice QR utilizzando API Camera2. Nella vecchia API fotocamera è facile come:Come ottenere un frame di anteprima singolo in Camera2 API Android 5.0?

android.hardware.Camera mCamera; 
    ... 
    mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
     @Override 
     public void onPreviewFrame(byte[] data, Camera camera) { 
      // will be invoked for every preview frame in addition to displaying them on the screen    
     } 
    }); 

Tuttavia, io non posso trovare un modo per ottenere che l'utilizzo di nuova API Camera2. Mi piacerebbe ricevere più frame su cui lavorare: il meglio sarebbe ricevere array di byte come nella vecchia API. Qualche idea su come farlo?

+1

Dai un'occhiata a questa domanda. http://stackoverflow.com/questions/25462277/camera-preview-image-data-processing-with-android-l-and-camera2-api – panonski

+0

https://github.com/Gutyn/camera2QRcodeReader Ho postato questo esempio che utilizza la nuovissima API della fotocamera Android2 per leggere il codice QR. godere –

risposta

2

Utilizzare sotto il codice per farlo.

CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     try { 
      CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId()); 
      Size[] jpegSizes = null; 
      if (characteristics != null) { 
       jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.JPEG); 
      } 
      int width = 480;//480x320 
      int height = 320; 
      if (jpegSizes != null && 0 < jpegSizes.length) { 
       width = jpegSizes[0].getWidth(); 
       height = jpegSizes[0].getHeight(); 
      } 
      ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); 
      List<Surface> outputSurfaces = new ArrayList<Surface>(2); 
      outputSurfaces.add(reader.getSurface()); 
      outputSurfaces.add(new Surface(textureView.getSurfaceTexture())); 
      final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
      captureBuilder.addTarget(reader.getSurface()); 
      captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); 
      // Orientation 
      int rotation = ((Activity) context).getWindowManager().getDefaultDisplay().getRotation(); 
      captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 
      final File file = getFileDir(); 
      ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { 
       @Override 
       public void onImageAvailable(ImageReader reader) { 
        Image image = null; 
        try { 
         image = reader.acquireLatestImage(); 
         ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
         byte[] bytes = new byte[buffer.capacity()]; 
         buffer.get(bytes); 
         save(bytes); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
         if (image != null) { 
          image.close(); 
         } 
        } 
       } 

       private void save(byte[] bytes) throws IOException { 
        OutputStream output = null; 
        try { 
         output = new FileOutputStream(file); 
         output.write(bytes); 
        } finally { 
         if (null != output) { 
          output.close(); 
         } 
        } 
       } 
      }; 
      reader.setOnImageAvailableListener(readerListener, mBackgroundHandler); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
Problemi correlati