save code

This commit is contained in:
xsl
2025-09-10 18:45:17 +08:00
parent 9a71226b9c
commit fa787d1751
3 changed files with 220 additions and 33 deletions
@@ -2,47 +2,61 @@ package com.khronos.vulkan_samples;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.SurfaceTexture;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.Preview;
import androidx.camera.core.SurfaceRequest;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.androidgamesdk.GameActivity;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.mediapipe.examples.facelandmarker.FaceLandmarkerHelper;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
public class MainActivity extends GameActivity {
private PreviewView previewView;
private TextureView textureView; // 使用 TextureView 替代 PreviewView
private ProcessCameraProvider cameraProvider;
private FrameLayout containerLayout;
private void initCamera(){
// 创建摄像头预览视图
previewView = new PreviewView(this);
previewView.setImplementationMode(PreviewView.ImplementationMode.COMPATIBLE);
previewView.setScaleType(PreviewView.ScaleType.FILL_CENTER);
// 获取 GameActivity 的根视图
ViewGroup rootView = (ViewGroup) getWindow().getDecorView();
addContentView(previewView, new ViewGroup.LayoutParams(
// 创建容器布局
containerLayout = new FrameLayout(this);
containerLayout.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
));
bringVulkanToFront();
// 创建 TextureView 用于摄像头预览
textureView = new TextureView(this);
textureView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
));
// 将 TextureView 添加到容器
containerLayout.addView(textureView);
// 将容器添加到根视图的底部(作为背景)
//rootView.addView(containerLayout); // 添加到索引0(最底层)
rootView.addView(containerLayout, 0);
if (hasCameraPermission()) {
startCamera();
@@ -51,23 +65,6 @@ public class MainActivity extends GameActivity {
}
}
private void bringVulkanToFront() {
// 获取窗口的根视图
View rootView = getWindow().getDecorView();
if (rootView instanceof ViewGroup) {
ViewGroup rootGroup = (ViewGroup) rootView;
for (int i = rootGroup.getChildCount() - 1; i >= 0; i--) {
View child = rootGroup.getChildAt(i);
if (child != previewView) {
child.bringToFront();
child.setBackgroundColor(Color.TRANSPARENT);
break;
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -115,7 +112,18 @@ public class MainActivity extends GameActivity {
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
// 使用 TextureView 的 SurfaceTexture
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
if (surfaceTexture != null) {
Surface surface = new Surface(surfaceTexture);
preview.setSurfaceProvider(new Preview.SurfaceProvider() {
@Override
public void onSurfaceRequested(@NonNull SurfaceRequest request) {
request.provideSurface(surface, ContextCompat.getMainExecutor(MainActivity.this),
result -> {});
}
});
}
cameraProvider.bindToLifecycle(this, cameraSelector, preview);
@@ -125,6 +133,7 @@ public class MainActivity extends GameActivity {
}, ContextCompat.getMainExecutor(this));
}
private static final int REQUEST_CODE_PERMISSIONS = 1001;
private static final String[] REQUIRED_PERMISSIONS = new String[]{Manifest.permission.CAMERA};
private static final String TAG = "MainActivity";