save code
This commit is contained in:
@@ -0,0 +1,137 @@
|
|||||||
|
package com.khronos.vulkan_samples; // Assuming this is your package name
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.camera.core.AspectRatio; // <-- Added import
|
||||||
|
import androidx.camera.core.CameraSelector;
|
||||||
|
import androidx.camera.core.ImageAnalysis;
|
||||||
|
import androidx.camera.core.ImageProxy;
|
||||||
|
import androidx.camera.core.Preview;
|
||||||
|
import androidx.camera.lifecycle.ProcessCameraProvider;
|
||||||
|
import androidx.camera.view.PreviewView;
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
public class CameraActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private static final String TAG = "CameraActivity";
|
||||||
|
private static final int REQUEST_CODE_PERMISSIONS = 1001;
|
||||||
|
private static final String[] REQUIRED_PERMISSIONS = new String[]{Manifest.permission.CAMERA};
|
||||||
|
|
||||||
|
private PreviewView previewView;
|
||||||
|
private ExecutorService cameraExecutor;
|
||||||
|
private ProcessCameraProvider cameraProvider;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
FrameLayout layout = new FrameLayout(this);
|
||||||
|
previewView = new PreviewView(this);
|
||||||
|
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
);
|
||||||
|
previewView.setLayoutParams(params);
|
||||||
|
layout.addView(previewView);
|
||||||
|
setContentView(layout);
|
||||||
|
|
||||||
|
cameraExecutor = Executors.newSingleThreadExecutor();
|
||||||
|
|
||||||
|
if (allPermissionsGranted()) {
|
||||||
|
startCamera();
|
||||||
|
} else {
|
||||||
|
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startCamera() {
|
||||||
|
ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
|
||||||
|
|
||||||
|
cameraProviderFuture.addListener(() -> {
|
||||||
|
try {
|
||||||
|
// Camera provider is now guaranteed to be available
|
||||||
|
cameraProvider = cameraProviderFuture.get();
|
||||||
|
|
||||||
|
// Select back camera
|
||||||
|
CameraSelector cameraSelector = new CameraSelector.Builder()
|
||||||
|
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Set up the preview use case
|
||||||
|
Preview preview = new Preview.Builder().build();
|
||||||
|
preview.setSurfaceProvider(previewView.getSurfaceProvider());
|
||||||
|
|
||||||
|
|
||||||
|
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
|
||||||
|
.setTargetAspectRatio(AspectRatio.RATIO_4_3)
|
||||||
|
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
imageAnalysis.setAnalyzer(cameraExecutor, new ImageAnalysis.Analyzer() {
|
||||||
|
@Override
|
||||||
|
public void analyze(@NonNull ImageProxy imageProxy) {
|
||||||
|
int rotationDegrees = imageProxy.getImageInfo().getRotationDegrees();
|
||||||
|
Log.d(TAG, "Received image: " + imageProxy.getWidth() + "x" + imageProxy.getHeight() +
|
||||||
|
" rotation: " + rotationDegrees);
|
||||||
|
imageProxy.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
cameraProvider.unbindAll();
|
||||||
|
|
||||||
|
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis);
|
||||||
|
|
||||||
|
} catch (ExecutionException | InterruptedException e) {
|
||||||
|
Log.e(TAG, "Error starting camera", e);
|
||||||
|
}
|
||||||
|
}, ContextCompat.getMainExecutor(this)); // Run listener on main thread
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean allPermissionsGranted() {
|
||||||
|
for (String permission : REQUIRED_PERMISSIONS) {
|
||||||
|
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
if (requestCode == REQUEST_CODE_PERMISSIONS) {
|
||||||
|
if (allPermissionsGranted()) {
|
||||||
|
startCamera();
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "Permissions not granted by the user.");
|
||||||
|
finish(); // Close the activity if permission is denied
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (cameraExecutor != null) {
|
||||||
|
cameraExecutor.shutdown();
|
||||||
|
}
|
||||||
|
// Ensure camera is unbound in onDestroy
|
||||||
|
if (cameraProvider != null) {
|
||||||
|
cameraProvider.unbindAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user