diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java b/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java
index 7cb2610..2deeda8 100644
--- a/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java
+++ b/app/src/main/java/com/example/cameraxtestappjava/MainActivity.java
@@ -2,30 +2,23 @@ package com.example.cameraxtestappjava;
import android.content.ContentValues;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
-import android.provider.MediaStore;
-import android.util.Log;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
-import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureException;
-import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
+import com.example.cameraxtestappjava.camera.CustomCamera;
+import com.example.cameraxtestappjava.camera.CustomCameraCallback;
import com.example.cameraxtestappjava.databinding.ActivityMainBinding;
import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.ExecutionException;
-
public class MainActivity extends AppCompatActivity {
ProcessCameraProvider cameraProvider;
@@ -36,6 +29,7 @@ public class MainActivity extends AppCompatActivity {
String fileName;
Uri tempFileUri;
+ CustomCamera customCamera;
ActivityMainBinding binding;
@Override
@@ -46,9 +40,10 @@ public class MainActivity extends AppCompatActivity {
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
- setListeners();
- setUpCamera();
+ customCamera = new CustomCamera(this);
+ customCamera.initCustomCamera(this, ContextCompat.getMainExecutor(this), this);
+ binding.scSegpassCameraView.takePictureBtn.setOnClickListener(v -> takePicture());
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
@@ -57,7 +52,21 @@ public class MainActivity extends AppCompatActivity {
});
}
- private void setListeners() {
+ private void takePicture() {
+ customCamera.capturePhoto(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();
+ }
+ });
+ }
+
+ /*private void setListeners() {
binding.btnTakePicture.setOnClickListener(v -> capturePhoto());
}
@@ -129,5 +138,5 @@ public class MainActivity extends AppCompatActivity {
e.printStackTrace();
}
- }
+ }*/
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera.java b/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera.java
new file mode 100644
index 0000000..16ebb68
--- /dev/null
+++ b/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera.java
@@ -0,0 +1,156 @@
+package com.example.cameraxtestappjava.camera;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.MediaStore;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.camera.core.CameraSelector;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageCaptureException;
+import androidx.camera.core.Preview;
+import androidx.camera.lifecycle.ProcessCameraProvider;
+import androidx.camera.view.PreviewView;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.example.cameraxtestappjava.R;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+
+public class CustomCamera extends FrameLayout {
+
+ // View
+ private final View rootView;
+ private PreviewView cameraViewFinder;
+ public AppCompatButton takePictureBtn;
+
+ private Executor mExecutor;
+ private Context mContext;
+
+ private LifecycleOwner mLifecycleOwner;
+
+ // Camera
+ private ProcessCameraProvider cameraProvider;
+ private ImageCapture imageCapture;
+ private ImageCapture.OutputFileOptions outputFileOptions;
+ private ListenableFuture cameraProviderFuture;
+ private ContentValues contentValues;
+ private String fileName;
+ private Uri tempFileUri;
+
+ public CustomCamera(@NonNull Context context) {
+ super(context);
+ rootView = inflate(context, R.layout.custom_camera_view, this);
+ }
+
+ public CustomCamera(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ // Aqui van los estilos y todo eso si se requiere
+ rootView = inflate(context, R.layout.custom_camera_view, this);
+ }
+
+ public void initCustomCamera(@NonNull Context context, Executor executor, LifecycleOwner lifecycleOwner) {
+ mExecutor = executor;
+ mContext = context;
+ mLifecycleOwner = lifecycleOwner;
+ initComponents();
+ }
+
+ private void initComponents() {
+ findIds();
+ initializeCamera();
+ initializeListeners();
+ }
+
+ private void findIds() {
+ cameraViewFinder = rootView.findViewById(R.id.pvViewfinder);
+ takePictureBtn = rootView.findViewById(R.id.btnTakePicture);
+ }
+
+ private void initializeListeners() {
+ //takePictureBtn.setOnClickListener( v -> capturePhoto() );
+ }
+
+ // El callback se tiene que implementar del lado de la aplicacion integradora
+ public void capturePhoto(CustomCameraCallback callback) {
+ if (imageCapture == null) return;
+
+ fileName = System.currentTimeMillis() + "";
+
+ outputFileOptions = getOutputFileOptions(fileName);
+
+ imageCapture.takePicture(outputFileOptions, mExecutor, new ImageCapture.OnImageSavedCallback() {
+ @Override
+ public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
+ tempFileUri = outputFileResults.getSavedUri();
+ callback.onPictureTakenSuccess("Image saved! " + tempFileUri);
+ //Toast.makeText(mContext, "Image saved! " + tempFileUri, Toast.LENGTH_LONG).show();
+ }
+
+ @Override
+ public void onError(@NonNull ImageCaptureException exception) {
+ callback.onPictureTakenFailError(exception.getMessage());
+ //Toast.makeText(mContext, "Image Not Saved " + exception.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+
+
+
+ @NonNull
+ private ImageCapture.OutputFileOptions getOutputFileOptions(String name) {
+ contentValues = new ContentValues();
+ contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
+ contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
+
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
+ contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/CameraXTestApp");
+ }
+
+ return new ImageCapture.OutputFileOptions.Builder(
+ mContext.getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues
+ ).build();
+ }
+
+ private void initializeCamera() {
+ cameraProviderFuture = ProcessCameraProvider.getInstance(mContext);
+ cameraProviderFuture.addListener(() -> {
+ try {
+ cameraProvider = cameraProviderFuture.get();
+ startCustomCamera(cameraProvider);
+ } catch (ExecutionException | InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+
+ }, mExecutor); // por parametro
+ }
+
+ private void startCustomCamera(ProcessCameraProvider cameraProvider) {
+ Log.d("TAGTAG", "UEEEP");
+ CameraSelector cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA;
+
+ Preview preview = new Preview.Builder().build();
+ preview.setSurfaceProvider(cameraViewFinder.getSurfaceProvider());
+
+ imageCapture = new ImageCapture.Builder().build();
+
+ try {
+ cameraProvider.unbindAll();
+
+ cameraProvider.bindToLifecycle(mLifecycleOwner, cameraSelector, preview, imageCapture);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCameraCallback.java b/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCameraCallback.java
new file mode 100644
index 0000000..3e89f95
--- /dev/null
+++ b/app/src/main/java/com/example/cameraxtestappjava/camera/CustomCameraCallback.java
@@ -0,0 +1,9 @@
+package com.example.cameraxtestappjava.camera;
+
+public interface CustomCameraCallback {
+
+ void onPictureTakenSuccess(String message);
+ void onPictureTakenFailError(String error);
+
+
+}
diff --git a/app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCamera.java b/app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCamera.java
deleted file mode 100644
index 7a6f7c1..0000000
--- a/app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCamera.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.example.cameraxtestappjava.camera;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.appcompat.widget.AppCompatButton;
-import androidx.camera.view.PreviewView;
-
-import com.example.cameraxtestappjava.R;
-
-import java.util.concurrent.Executor;
-
-public class SegPassCamera extends FrameLayout {
-
- private final View rootView;
- private PreviewView cameraViewFinder;
- private AppCompatButton takePictureBtn;
-
- private Executor mExecutor;
- private Context mContext;
-
- public SegPassCamera(@NonNull Context context) {
- super(context);
- rootView = inflate(context, R.layout.segpass_camera, this);
- initComponents();
- }
-
- public SegPassCamera(@NonNull Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
- // Aqui van los estilos y todo eso si se requiere
- rootView = inflate(context, R.layout.segpass_camera, this);
- initComponents();
- }
-
- public SegPassCamera(@NonNull Context context, Executor executor) {
- super(context);
- rootView = inflate(context, R.layout.segpass_camera, this);
- initEnvironment(context, executor);
- initComponents();
- }
-
- private void initEnvironment(@NonNull Context context, Executor executor) {
- mExecutor = executor;
- mContext = context;
- }
-
- public SegPassCamera(@NonNull Context context, @Nullable AttributeSet attrs, Executor executor) {
- super(context, attrs);
- // Aqui van los estilos y todo eso si se requiere
- rootView = inflate(context, R.layout.segpass_camera, this);
- initEnvironment(context, executor);
- initComponents();
- }
-
- private void initComponents() {
- findIds();
- initializeCamera();
- initializeListeners();
- }
-
- private void findIds() {
- cameraViewFinder = findViewById(R.id.pvViewfinder);
- takePictureBtn = findViewById(R.id.btnTakePicture);
- }
-
- private void initializeCamera() {
- }
-
- private void initializeListeners() {
-
- }
-
- private void setUpCamera() {
-
- }
-
- private void startSegPassCamera() {
-
- }
-}
diff --git a/app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCameraDelegate.java b/app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCameraDelegate.java
deleted file mode 100644
index ca89753..0000000
--- a/app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCameraDelegate.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.example.cameraxtestappjava.camera;
-
-interface SegPassCameraDelegate {
-
- void onPictureTakenSuccess();
- void onPictureTakenFailError();
-
-
-}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 8350491..5b6f111 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -7,33 +7,14 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
-
-
-
+ app:layout_constraintEnd_toEndOf="parent" />
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/segpass_camera.xml b/app/src/main/res/layout/custom_camera_view.xml
similarity index 100%
rename from app/src/main/res/layout/segpass_camera.xml
rename to app/src/main/res/layout/custom_camera_view.xml