From 3607bf9b928951cac0a66f59915dcc112bdbfc6b Mon Sep 17 00:00:00 2001 From: Xiang Silian Date: Wed, 10 Sep 2025 14:37:24 +0800 Subject: [PATCH] save code --- .../vulkan_samples/CameraActivity.java | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 app/android/java/com/khronos/vulkan_samples/CameraActivity.java diff --git a/app/android/java/com/khronos/vulkan_samples/CameraActivity.java b/app/android/java/com/khronos/vulkan_samples/CameraActivity.java new file mode 100644 index 0000000..7a43399 --- /dev/null +++ b/app/android/java/com/khronos/vulkan_samples/CameraActivity.java @@ -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 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(); + } + } +} \ No newline at end of file