control commit

This commit is contained in:
Captain Arepa 2024-05-17 10:36:58 -04:00
parent c06968c582
commit 7604a00532
8 changed files with 198 additions and 130 deletions

6
.idea/vcs.xml Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View file

@ -2,30 +2,23 @@ package com.example.cameraxtestappjava;
import android.content.ContentValues; import android.content.ContentValues;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture; import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider; import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets; import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat; 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.example.cameraxtestappjava.databinding.ActivityMainBinding;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import java.util.concurrent.ExecutionException;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
ProcessCameraProvider cameraProvider; ProcessCameraProvider cameraProvider;
@ -36,6 +29,7 @@ public class MainActivity extends AppCompatActivity {
String fileName; String fileName;
Uri tempFileUri; Uri tempFileUri;
CustomCamera customCamera;
ActivityMainBinding binding; ActivityMainBinding binding;
@Override @Override
@ -46,9 +40,10 @@ public class MainActivity extends AppCompatActivity {
binding = ActivityMainBinding.inflate(getLayoutInflater()); binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot()); setContentView(binding.getRoot());
setListeners(); customCamera = new CustomCamera(this);
setUpCamera(); customCamera.initCustomCamera(this, ContextCompat.getMainExecutor(this), this);
binding.scSegpassCameraView.takePictureBtn.setOnClickListener(v -> takePicture());
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); 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()); binding.btnTakePicture.setOnClickListener(v -> capturePhoto());
} }
@ -129,5 +138,5 @@ public class MainActivity extends AppCompatActivity {
e.printStackTrace(); e.printStackTrace();
} }
} }*/
} }

View file

@ -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<ProcessCameraProvider> 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();
}
}
}

View file

@ -0,0 +1,9 @@
package com.example.cameraxtestappjava.camera;
public interface CustomCameraCallback {
void onPictureTakenSuccess(String message);
void onPictureTakenFailError(String error);
}

View file

@ -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() {
}
}

View file

@ -1,9 +0,0 @@
package com.example.cameraxtestappjava.camera;
interface SegPassCameraDelegate {
void onPictureTakenSuccess();
void onPictureTakenFailError();
}

View file

@ -7,33 +7,14 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity"> tools:context=".MainActivity">
<androidx.camera.view.PreviewView <com.example.cameraxtestappjava.camera.CustomCamera
android:id="@+id/pvViewfinder" android:id="@+id/scSegpassCameraView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
app:layout_constraintBottom_toTopOf="@id/llCameraButtons" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/llCameraButtons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/pvViewfinder"> app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btnTakePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Picture" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>