From 467f07ccdcd393b6f8d3345f9bf4834b36a2ce9b Mon Sep 17 00:00:00 2001 From: Captain Arepa Date: Tue, 21 May 2024 15:36:28 -0400 Subject: [PATCH] camera2 implementation (WIP) --- .../cameraxtestappjava/MainActivity.java | 12 +++- .../camera/CustomCamera2.java | 72 +++++++++---------- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java b/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java index 9f9f5d4..d86e305 100644 --- a/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java +++ b/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java @@ -116,7 +116,17 @@ public class MainActivity extends AppCompatActivity { mTextureView = binding.c2Camera.tvCameraTextureView; mTakePictureButton = binding.c2Camera.btnTakepicture; mCustomCamera2 = new CustomCamera2(this, mTextureView); - mTakePictureButton.setOnClickListener(v -> mCustomCamera2.takePicture()); + mTakePictureButton.setOnClickListener(v -> mCustomCamera2.takePicture(new CustomCameraCallback() { + @Override + public void onPictureTakenSuccess(String message) { + Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show(); + } + + @Override + public void onPictureTakenFailError(String error) { + Toast.makeText(MainActivity.this, error, Toast.LENGTH_LONG).show(); + } + })); } diff --git a/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera2.java b/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera2.java index 8820846..37b5f4f 100644 --- a/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera2.java +++ b/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera2.java @@ -69,6 +69,7 @@ public class CustomCamera2 { private Size mImageDimension; private ImageReader mImageReader; private File mFileFolder; + private File mFile; public static final int REQUEST_CAMERA_PERMISSION = 200; private Handler mBackgroundHandler; private HandlerThread mBackgroundThread; @@ -295,7 +296,7 @@ public class CustomCamera2 { } //Take Picture - public void takePicture() { + public void takePicture(CustomCameraCallback cameraCallback) { if (mCameraDevice == null) { Log.e(TAG, "cameraDevice is null"); return; @@ -316,62 +317,45 @@ public class CustomCamera2 { height = jpegSizes[0].getHeight(); } - ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); + ImageReader mReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); List outputSurfaces = new ArrayList(2); - outputSurfaces.add(reader.getSurface()); + outputSurfaces.add(mReader.getSurface()); outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture())); final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); - captureBuilder.addTarget(reader.getSurface()); + captureBuilder.addTarget(mReader.getSurface()); captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); // Orientation int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); String fileName = "IMG_" + System.currentTimeMillis() + ".jpg"; - final File file = new File(mFileFolder + "/" + fileName); // Ver como hacer para guardar en la carpeta de la app - ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { - @Override - public void onImageAvailable(ImageReader reader) { - try (Image image = reader.acquireLatestImage()) { - ByteBuffer buffer = image.getPlanes()[0].getBuffer(); - byte[] bytes = new byte[buffer.capacity()]; - buffer.get(bytes); - savePicture(bytes); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } + mFile = new File(mFileFolder + "/" + fileName); // Ver como hacer para guardar en la carpeta de la app - private void savePicture(byte[] bytes) throws IOException { - OutputStream output = null; - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - output = Files.newOutputStream(file.toPath()); - } else { - output = new FileOutputStream(file); - } - output.write(bytes); - } finally { - if (output != null) { - output.close(); - } - } + ImageReader.OnImageAvailableListener readerListener = iReader -> { + try (Image image = iReader.acquireLatestImage()) { + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + byte[] bytes = new byte[buffer.capacity()]; + buffer.get(bytes); + savePicture(bytes); + } catch (IOException e) { + cameraCallback.onPictureTakenFailError(e.getMessage()); } }; - reader.setOnImageAvailableListener(readerListener, mBackgroundHandler); + + mReader.setOnImageAvailableListener(readerListener, mBackgroundHandler); final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); Log.d(TAG, "file"); - Toast.makeText(mActivity, "Saved:" + file, Toast.LENGTH_SHORT).show(); + //Toast.makeText(mActivity, "Saved:" + mFile, Toast.LENGTH_SHORT).show(); createCameraPreview(); + cameraCallback.onPictureTakenSuccess("Saved:" + mFile); } }; + mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { @@ -387,7 +371,23 @@ public class CustomCamera2 { } }, mBackgroundHandler); } catch (CameraAccessException e) { - e.printStackTrace(); + cameraCallback.onPictureTakenFailError(e.getMessage()); + } + } + + private void savePicture(byte[] bytes) throws IOException { + OutputStream output = null; + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + output = Files.newOutputStream(mFile.toPath()); + } else { + output = new FileOutputStream(mFile); + } + output.write(bytes); + } finally { + if (output != null) { + output.close(); + } } }