15

Ich versuche, eine Vorschau Frame für QR-Code-Scan-Funktionalität mit Camera2 API zu bekommen. In alten Kamera-API ist es so einfach wie:Wie bekomme ich ein einzelnes Vorschaubild 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    
     } 
    }); 

Aber ich nicht kann einen Weg finden neue Camera2 API zu erreichen, dass die Verwendung. Ich möchte mehrere Frames erhalten, an denen ich arbeiten kann - am besten wäre es, Byte-Arrays wie in der alten API zu erhalten. Irgendwelche Ideen, wie man das macht?

+1

Werfen Sie einen Blick auf diese Frage. http://stackoverflow.com/questions/25462277/camera-preview-image-data-processing-with-android-l-and-camera2-api – panonski

+0

https://github.com/Gutyn/camera2QRcodeReader Ich postete dieses Beispiel welches nutzt die neueste API der Android2-Kamera, um den QR-Code zu lesen. genießen –

Antwort

2

Verwenden Sie den folgenden Code, um dies zu tun.

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