From 7604a005324618c8318c0f3e744f63fd0467759d Mon Sep 17 00:00:00 2001 From: Captain Arepa Date: Fri, 17 May 2024 10:36:58 -0400 Subject: [PATCH] control commit --- .idea/vcs.xml | 6 + .../cameraxtestappjava/MainActivity.java | 35 ++-- .../camera/CustomCamera.java | 156 ++++++++++++++++++ .../camera/CustomCameraCallback.java | 9 + .../camera/SegPassCamera.java | 84 ---------- .../camera/SegPassCameraDelegate.java | 9 - app/src/main/res/layout/activity_main.xml | 29 +--- ...pass_camera.xml => custom_camera_view.xml} | 0 8 files changed, 198 insertions(+), 130 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/com/example/cameraxtestappjava/camera/CustomCamera.java create mode 100644 app/src/main/java/com/example/cameraxtestappjava/camera/CustomCameraCallback.java delete mode 100644 app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCamera.java delete mode 100644 app/src/main/java/com/example/cameraxtestappjava/camera/SegPassCameraDelegate.java rename app/src/main/res/layout/{segpass_camera.xml => custom_camera_view.xml} (100%) 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