camera2 implementation (WIP)

This commit is contained in:
Captain Arepa 2024-05-21 15:36:28 -04:00
parent f99dc361bf
commit 467f07ccdc
2 changed files with 47 additions and 37 deletions

View file

@ -116,7 +116,17 @@ public class MainActivity extends AppCompatActivity {
mTextureView = binding.c2Camera.tvCameraTextureView; mTextureView = binding.c2Camera.tvCameraTextureView;
mTakePictureButton = binding.c2Camera.btnTakepicture; mTakePictureButton = binding.c2Camera.btnTakepicture;
mCustomCamera2 = new CustomCamera2(this, mTextureView); 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();
}
}));
} }

View file

@ -69,6 +69,7 @@ public class CustomCamera2 {
private Size mImageDimension; private Size mImageDimension;
private ImageReader mImageReader; private ImageReader mImageReader;
private File mFileFolder; private File mFileFolder;
private File mFile;
public static final int REQUEST_CAMERA_PERMISSION = 200; public static final int REQUEST_CAMERA_PERMISSION = 200;
private Handler mBackgroundHandler; private Handler mBackgroundHandler;
private HandlerThread mBackgroundThread; private HandlerThread mBackgroundThread;
@ -295,7 +296,7 @@ public class CustomCamera2 {
} }
//Take Picture //Take Picture
public void takePicture() { public void takePicture(CustomCameraCallback cameraCallback) {
if (mCameraDevice == null) { if (mCameraDevice == null) {
Log.e(TAG, "cameraDevice is null"); Log.e(TAG, "cameraDevice is null");
return; return;
@ -316,62 +317,45 @@ public class CustomCamera2 {
height = jpegSizes[0].getHeight(); height = jpegSizes[0].getHeight();
} }
ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); ImageReader mReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
List<Surface> outputSurfaces = new ArrayList<Surface>(2); List<Surface> outputSurfaces = new ArrayList<Surface>(2);
outputSurfaces.add(reader.getSurface()); outputSurfaces.add(mReader.getSurface());
outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture())); outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture()));
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 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); captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
// Orientation // Orientation
int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation(); int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
String fileName = "IMG_" + System.currentTimeMillis() + ".jpg"; String fileName = "IMG_" + System.currentTimeMillis() + ".jpg";
final File file = new File(mFileFolder + "/" + fileName); // Ver como hacer para guardar en la carpeta de la app mFile = 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();
}
}
private void savePicture(byte[] bytes) throws IOException { ImageReader.OnImageAvailableListener readerListener = iReader -> {
OutputStream output = null; try (Image image = iReader.acquireLatestImage()) {
try { ByteBuffer buffer = image.getPlanes()[0].getBuffer();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { byte[] bytes = new byte[buffer.capacity()];
output = Files.newOutputStream(file.toPath()); buffer.get(bytes);
} else { savePicture(bytes);
output = new FileOutputStream(file); } catch (IOException e) {
} cameraCallback.onPictureTakenFailError(e.getMessage());
output.write(bytes);
} finally {
if (output != null) {
output.close();
}
}
} }
}; };
reader.setOnImageAvailableListener(readerListener, mBackgroundHandler);
mReader.setOnImageAvailableListener(readerListener, mBackgroundHandler);
final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() {
@Override @Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result); super.onCaptureCompleted(session, request, result);
Log.d(TAG, "file"); Log.d(TAG, "file");
Toast.makeText(mActivity, "Saved:" + file, Toast.LENGTH_SHORT).show(); //Toast.makeText(mActivity, "Saved:" + mFile, Toast.LENGTH_SHORT).show();
createCameraPreview(); createCameraPreview();
cameraCallback.onPictureTakenSuccess("Saved:" + mFile);
} }
}; };
mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
@Override @Override
public void onConfigured(@NonNull CameraCaptureSession session) { public void onConfigured(@NonNull CameraCaptureSession session) {
@ -387,7 +371,23 @@ public class CustomCamera2 {
} }
}, mBackgroundHandler); }, mBackgroundHandler);
} catch (CameraAccessException e) { } 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();
}
} }
} }