This commit is contained in:
Captain Arepa 2024-05-23 15:12:26 -04:00
parent 43415be913
commit 6fdb9f4f7b
4 changed files with 96 additions and 42 deletions

View file

@ -1,7 +1,9 @@
package com.example.cameraxtestappjava; package com.example.cameraxtestappjava;
import static com.example.cameraxtestappjava.segpasscamerra.SegpassNewCamera2.REQUEST_CAMERA_PERMISSION; import static com.example.cameraxtestappjava.segpasscamerra.Camera2NewLib.REQUEST_CAMERA_PERMISSION;
import android.annotation.SuppressLint;
import android.content.pm.ActivityInfo;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
@ -14,6 +16,7 @@ import androidx.core.view.WindowInsetsCompat;
import android.Manifest; import android.Manifest;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.view.WindowManager;
import com.example.cameraxtestappjava.camera.AutoFitTextureView; import com.example.cameraxtestappjava.camera.AutoFitTextureView;
@ -21,23 +24,25 @@ import com.example.cameraxtestappjava.camera.SegpassCameraCallback;
import com.example.cameraxtestappjava.camera.SegpassCameraStateCallback; import com.example.cameraxtestappjava.camera.SegpassCameraStateCallback;
import com.example.cameraxtestappjava.camera.SegpassPermissionListener; import com.example.cameraxtestappjava.camera.SegpassPermissionListener;
import com.example.cameraxtestappjava.databinding.ActivityCameraNewBinding; import com.example.cameraxtestappjava.databinding.ActivityCameraNewBinding;
import com.example.cameraxtestappjava.segpasscamerra.SegpassNewCamera2; import com.example.cameraxtestappjava.segpasscamerra.Camera2NewLib;
public class CameraActivityNew extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback, SegpassCameraCallback, SegpassCameraStateCallback, SegpassPermissionListener { public class CameraActivityNew extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback, SegpassCameraCallback, SegpassCameraStateCallback, SegpassPermissionListener {
ActivityCameraNewBinding binding; ActivityCameraNewBinding binding;
SegpassNewCamera2 mCamera2; Camera2NewLib mCamera2;
AutoFitTextureView mTextureView; AutoFitTextureView mTextureView;
@SuppressLint("SourceLockedOrientationActivity")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
EdgeToEdge.enable(this); EdgeToEdge.enable(this);
binding = ActivityCameraNewBinding.inflate(getLayoutInflater()); binding = ActivityCameraNewBinding.inflate(getLayoutInflater());
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(binding.getRoot()); setContentView(binding.getRoot());
mTextureView = binding.inCamera2.tvCameraTextureView; mTextureView = binding.inCamera2.tvCameraTextureView;
mCamera2 = new SegpassNewCamera2(this, mTextureView, this, this); mCamera2 = new Camera2NewLib(this, mTextureView, this, this);
mCamera2.init(); mCamera2.init();
setUpListeners(); setUpListeners();
@ -74,8 +79,7 @@ public class CameraActivityNew extends AppCompatActivity implements ActivityComp
private void setUpListeners() { private void setUpListeners() {
binding.inCamera2.btnTakepicture.setOnClickListener(v -> { binding.inCamera2.btnTakepicture.setOnClickListener(v -> {
mCamera2.takePhoto(); mCamera2.takePicture(this);
mCamera2.showToast("eueep");
}); });
} }

View file

@ -36,6 +36,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.example.cameraxtestappjava.camera.AutoFitTextureView; import com.example.cameraxtestappjava.camera.AutoFitTextureView;
import com.example.cameraxtestappjava.camera.SegpassCameraCallback;
import com.example.cameraxtestappjava.camera.SegpassCameraStateCallback; import com.example.cameraxtestappjava.camera.SegpassCameraStateCallback;
import com.example.cameraxtestappjava.camera.SegpassPermissionListener; import com.example.cameraxtestappjava.camera.SegpassPermissionListener;
@ -47,7 +48,7 @@ import java.util.List;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class SegpassNewCamera2 { public class Camera2NewLib {
/** /**
* Tag for the {@link Log}. * Tag for the {@link Log}.
@ -201,7 +202,7 @@ public class SegpassNewCamera2 {
* @param textureView * @param textureView
* @param listener * @param listener
*/ */
public SegpassNewCamera2(AppCompatActivity activity, AutoFitTextureView textureView, SegpassPermissionListener listener) { public Camera2NewLib(AppCompatActivity activity, AutoFitTextureView textureView, SegpassPermissionListener listener) {
mActivity = activity; mActivity = activity;
mTextureView = textureView; mTextureView = textureView;
mPermissionListener = listener; mPermissionListener = listener;
@ -215,7 +216,7 @@ public class SegpassNewCamera2 {
* @param listener * @param listener
* @param stateCallback * @param stateCallback
*/ */
public SegpassNewCamera2(AppCompatActivity activity, AutoFitTextureView textureView, SegpassPermissionListener listener, @Nullable SegpassCameraStateCallback stateCallback) { public Camera2NewLib(AppCompatActivity activity, AutoFitTextureView textureView, SegpassPermissionListener listener, @Nullable SegpassCameraStateCallback stateCallback) {
mActivity = activity; mActivity = activity;
mTextureView = textureView; mTextureView = textureView;
mPermissionListener = listener; mPermissionListener = listener;
@ -314,6 +315,7 @@ public class SegpassNewCamera2 {
private void process(CaptureResult result) { private void process(CaptureResult result) {
Log.d(TAG, "STATE " + mState); Log.d(TAG, "STATE " + mState);
//captureStillPicture();
switch (mState) { switch (mState) {
case STATE_PREVIEW: { case STATE_PREVIEW: {
// We have nothing to do when the camera preview is working normally. // We have nothing to do when the camera preview is working normally.
@ -598,16 +600,11 @@ public class SegpassNewCamera2 {
e.printStackTrace(); e.printStackTrace();
} catch (NullPointerException e) { } catch (NullPointerException e) {
mCameraStateCallback.onCameraInitError(e.getMessage()); mCameraStateCallback.onCameraInitError(e.getMessage());
// Currently an NPE is thrown when the Camera2API is used but not supported on the
// device this code runs.
/*ErrorDialog.newInstance(getString(R.string.camera_error))
.show(getChildFragmentManager(), FRAGMENT_DIALOG);*/
/// callback here
} }
} }
/** /**
* Opens the camera specified by {@link SegpassNewCamera2#mCameraId}. * Opens the camera specified by {@link Camera2NewLib#mCameraId}.
*/ */
private void openCamera(int width, int height) { private void openCamera(int width, int height) {
// Check permissions // Check permissions
@ -693,8 +690,9 @@ public class SegpassNewCamera2 {
// Auto focus should be continuous for camera preview. // Auto focus should be continuous for camera preview.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// Flash is automatically enabled when necessary. // Trigger AF
setAutoFlash(mPreviewRequestBuilder); mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_START);
// Finally, we start displaying the camera preview. // Finally, we start displaying the camera preview.
mPreviewRequest = mPreviewRequestBuilder.build(); mPreviewRequest = mPreviewRequestBuilder.build();
@ -754,8 +752,76 @@ public class SegpassNewCamera2 {
/** /**
* Initiate a still image capture. * Initiate a still image capture.
*/ */
public void takePhoto() { public void takePicture(SegpassCameraCallback cameraCallback) {
lockFocus(); if (mCameraDevice == null) {
Log.e(TAG, "cameraDevice is null");
return;
}
try {
CameraManager manager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId);
if (characteristics == null)
throw new CameraAccessException(CameraAccessException.CAMERA_ERROR);
Size[] jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.JPEG);
if (jpegSizes == null) throw new NullPointerException("Error taking picture");
int width = 640;
int height = 480;
if (jpegSizes.length > 0) {
width = jpegSizes[0].getWidth();
height = jpegSizes[0].getHeight();
}
ImageReader mReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
List<Surface> outputSurfaces = new ArrayList<Surface>(2);
outputSurfaces.add(mReader.getSurface());
outputSurfaces.add(new Surface(mTextureView.getSurfaceTexture()));
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
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";
mFile = new File(mFileFolder + "/" + fileName); // Ver como hacer para guardar en la carpeta de la app
mReader.setOnImageAvailableListener(mOnImageAvailableListener, 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:" + mFile, Toast.LENGTH_SHORT).show();
Log.d(TAG, mFile.toString());
cameraCallback.onPictureTakenSuccess("Saved:" + mFile);
createCameraPreviewSession();
}
};
mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
session.capture(captureBuilder.build(), captureListener, mBackgroundHandler);
} catch (CameraAccessException e) {
//showCameraStateError("onConfigured@takePicture(): " + e.getMessage());
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
}, mBackgroundHandler);
} catch (CameraAccessException e) {
cameraCallback.onPictureTakenFailError(e.getMessage());
}
} }
/** /**
@ -811,11 +877,6 @@ public class SegpassNewCamera2 {
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface()); captureBuilder.addTarget(mImageReader.getSurface());
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setAutoFlash(captureBuilder);
// Orientation // Orientation
int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation(); int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));
@ -864,7 +925,6 @@ public class SegpassNewCamera2 {
// Reset the auto-focus trigger // Reset the auto-focus trigger
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
setAutoFlash(mPreviewRequestBuilder);
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler); mBackgroundHandler);
// After this, the camera will go back to the normal state of preview. // After this, the camera will go back to the normal state of preview.
@ -876,13 +936,6 @@ public class SegpassNewCamera2 {
} }
} }
private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
if (mFlashSupported) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
}
}
/** /**
* Create Folder * Create Folder
*/ */

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main" android:id="@+id/main"
@ -13,4 +13,4 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -9,21 +9,18 @@
<com.example.cameraxtestappjava.camera.AutoFitTextureView <com.example.cameraxtestappjava.camera.AutoFitTextureView
android:id="@+id/tvCameraTextureView" android:id="@+id/tvCameraTextureView"
android:layout_gravity="center_vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"/>
android:layout_above="@id/btn_takepicture"
android:layout_alignParentTop="true" />
<ImageButton <ImageButton
android:id="@+id/btn_takepicture" android:id="@+id/btn_takepicture"
android:layout_width="80dip" android:layout_width="80dip"
android:layout_height="80dip" android:layout_height="80dip"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="?android:selectableItemBackground" android:background="?android:selectableItemBackground"
android:contentDescription="take_photo"
android:padding="10dip" android:padding="10dip"
android:layout_gravity="bottom|center"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/capture_button_video" /> android:src="@drawable/capture_button_video" />
</RelativeLayout> </FrameLayout>