120 lines
4.4 KiB
Kotlin
120 lines
4.4 KiB
Kotlin
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<out String>,
|
|
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()
|
|
}
|
|
} |