camera2 implementation (WIP)
This commit is contained in:
parent
f99dc361bf
commit
467f07ccdc
2 changed files with 47 additions and 37 deletions
|
@ -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();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<Surface> outputSurfaces = new ArrayList<Surface>(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue