package com.example.defenseapplication.login import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.widget.Toast import androidx.annotation.OptIn import androidx.appcompat.app.AppCompatActivity import androidx.camera.core.CameraSelector import androidx.camera.core.ExperimentalGetImage import androidx.camera.core.ImageAnalysis import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.example.defenseapplication.databinding.FaceVerificationActivityBinding import com.example.defenseapplication.view.FaceAnalyzer import com.google.mlkit.vision.face.FaceDetection import com.google.mlkit.vision.face.FaceDetectorOptions import com.gyf.immersionbar.ImmersionBar import java.util.concurrent.ExecutorService import java.util.concurrent.Executors //人脸采集 class FaceVerificationActivity : AppCompatActivity() { private lateinit var binding: FaceVerificationActivityBinding private lateinit var cameraExecutor: ExecutorService private var faceDetector: com.google.mlkit.vision.face.FaceDetector? = null companion object { private const val REQUEST_CAMERA_PERMISSION = 100 } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 使用标准 ViewBinding binding = FaceVerificationActivityBinding.inflate(layoutInflater) setContentView(binding.root) ImmersionBar.with(this) .statusBarDarkFont(true) .titleBar(binding.topContainer) .init() binding.backIcon.setOnClickListener { finish() } // 初始化人脸检测器(选项可自行调整) val options = FaceDetectorOptions.Builder() .setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_FAST) .setContourMode(FaceDetectorOptions.CONTOUR_MODE_NONE) .setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_NONE) .build() faceDetector = FaceDetection.getClient(options) cameraExecutor = Executors.newSingleThreadExecutor() // 检查并请求权限 checkCameraPermissionAndStart() } private fun checkCameraPermissionAndStart() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { startCamera() } else { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION ) } } @OptIn(ExperimentalGetImage::class) private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() // 预览用例 val preview = Preview.Builder().build().also { it.setSurfaceProvider(binding.previewView.surfaceProvider) } // 分析用例(人脸检测) val imageAnalysis = ImageAnalysis.Builder() .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() imageAnalysis.setAnalyzer(cameraExecutor, FaceAnalyzer(faceDetector, binding.overlay)) // 选择前置摄像头 val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA // 绑定到生命周期 cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis) }, ContextCompat.getMainExecutor(this)) } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CAMERA_PERMISSION) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCamera() } else { Toast.makeText(this, "需要相机权限才能进行人脸验证", Toast.LENGTH_SHORT).show() finish() } } } override fun onDestroy() { super.onDestroy() cameraExecutor.shutdown() faceDetector?.close() } }