Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo obtener un solo marco de vista previa en Camera2 API Android 5.0?

Estoy intentando conseguir un marco de la inspección previo para la funcionalidad de la exploración del código de QR usando el API de Camera2 . En la vieja Cámara API es tan fácil como:

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

Sin embargo, no puedo encontrar una manera de lograrlo utilizando la nueva API de Camera2. Me gustaría recibir varios marcos en los que pueda trabajar – lo mejor sería recibir una matriz de bytes como en la API antigua. ¿Alguna idea de cómo hacer eso?

  • Cómo convertir bitmap a PNG y luego a base64 en Android?
  • Crear un nuevo color dibujable
  • Exportar aplicación de Android con ProGuard da error de ParseException
  • La importación butterknife.InjectView no se puede resolver
  • ¿Cómo puedo excluir .jar externa de obfuscation por Proguard (proyecto de Android)?
  • GoogleMap necesita activación?
  • Añadir un filtro de color a un Drawable cambia todos los botones usando el mismo Drawable
  • Up-Sync y Down-Sync en Android?
  • One Solution collect form web for “¿Cómo obtener un solo marco de vista previa en Camera2 API Android 5.0?”

    Use debajo del código para hacerlo.

      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(); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.