实现了双屏摄像头显示,添加了部分代码

This commit is contained in:
zxj
2025-07-31 11:40:56 +08:00
parent 56e0a85a4c
commit de4c5f1c75
86 changed files with 3446 additions and 809 deletions
@@ -4,30 +4,30 @@ import android.Manifest
import android.app.Presentation
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Point
import android.hardware.Camera
import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CameraManager
import android.hardware.camera2.CaptureRequest
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.DisplayMetrics
import android.util.Log
import android.view.Display
import android.view.Surface
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer
import com.arcsoft.face.ErrorInfo
import com.sw.dualscreen.R
import com.sw.dualscreen.activity.MainActivity
import com.sw.dualscreen.databinding.PresentationSecondaryScreenBinding
import com.sw.dualscreen.viewmodel.MyViewModel
import com.sw.dualscreen.viewmodel.UserViewModel
import com.sw.plate.utils.ToastUtils
import com.sw.plate.utils.arcface.ConfigUtil
import com.sw.plate.utils.arcface.ErrorCodeUtil
@@ -50,15 +50,17 @@ class SecondaryScreenPresentation(
val activity: MainActivity,
context: Context,
display: Display,
viewModel: MyViewModel,
viewModel: UserViewModel,
private val onDismissListener: () -> Unit = {},
val recognizeViewModel: RecognizeViewModel
) : Presentation(context, display), ViewTreeObserver.OnGlobalLayoutListener {
private lateinit var binding: PresentationSecondaryScreenBinding
private var cameraDevice: CameraDevice? = null
private var cameraCaptureSession: CameraCaptureSession? = null
// private var cameraCaptureSession: CameraCaptureSession? = null
private lateinit var cameraManager: CameraManager
private var cameraIdList: Array<String> = arrayOf()
lateinit var previewView: PreviewView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -67,6 +69,8 @@ class SecondaryScreenPresentation(
setContentView(binding.root)
window?.setBackgroundDrawableResource(android.R.color.transparent)
previewView = binding.previewView
cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
// 获取摄像头列表
cameraIdList = cameraManager.cameraIdList
@@ -75,10 +79,15 @@ class SecondaryScreenPresentation(
return
}
cameraIdList.forEach {
Timber.d("摄像头id列表 = ${it}")
}
initArcViewModel()
initArcView()
openRectInfoDraw = true
openCamera(cameraIdList.last())
// binding.includeUserHeat.ivHeat.showText("1070千卡")
}
override fun onDisplayRemoved() {
@@ -86,19 +95,50 @@ class SecondaryScreenPresentation(
onDismissListener()
}
fun updateImage(bitmap: Bitmap) {
activity.runOnUiThread {
binding.ivImg.setImageBitmap(bitmap)
}
}
/**
* 用户1 显示相机预览
*/
fun step1(foodImg: Uri) {
}
/**
* 显示人脸识别
*/
fun step2() {
}
/**
* 显示识别出的菜品信息
*/
fun step3() {
}
private fun openCamera(cameraId: String) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) !=
PackageManager.PERMISSION_GRANTED
) {
return
}
try {
cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(device: CameraDevice) {
cameraDevice = device
// createCameraPreviewSession()
recognizeViewModel.init()
recognizeViewModel.init(
PreviewConfig(
2, 4, 0, 0
)
)
initRgbCamera()
resumeCamera()
}
@@ -118,44 +158,6 @@ class SecondaryScreenPresentation(
}
}
private fun createCameraPreviewSession() {
val textureView = binding.dualCameraTexturePreviewRgb
val surfaceTexture = textureView.surfaceTexture
surfaceTexture?.setDefaultBufferSize(textureView.width, textureView.height)
val surface = Surface(surfaceTexture)
try {
val previewRequestBuilder = cameraDevice?.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW
)?.apply {
addTarget(surface)
}
cameraDevice?.createCaptureSession(
listOf(surface),
object : CameraCaptureSession.StateCallback() {
override fun onConfigured(session: CameraCaptureSession) {
cameraCaptureSession = session
previewRequestBuilder?.let { builder ->
builder.set(
CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
)
session.setRepeatingRequest(builder.build(), null, null)
}
}
override fun onConfigureFailed(session: CameraCaptureSession) {
Toast.makeText(context, "配置失败", Toast.LENGTH_SHORT).show()
}
},
null
)
} catch (e: Exception) {
Log.e("Camera2", "创建预览会话失败", e)
}
}
// 虹软人脸配置 ⬇
private var isRecognition = false
private var rgbCameraHelper: DualCameraHelper? = null
@@ -296,7 +298,7 @@ class SecondaryScreenPresentation(
val layoutParams = adjustPreviewViewSize(
binding.dualCameraTexturePreviewRgb,
binding.dualCameraTexturePreviewRgb, binding.dualCameraFaceRectView,
previewSizeRgb, displayOrientation, 1f
previewSizeRgb, 90, 1f
)
Timber.d("initRgbCamera previewSizeRgb = ${previewSizeRgb.width}-${previewSizeRgb.height}")
Timber.d("initRgbCamera layoutParams = ${layoutParams.width}-${layoutParams.height}")
@@ -358,7 +360,7 @@ class SecondaryScreenPresentation(
)
)
.rotation(activity.windowManager.defaultDisplay.rotation)
.additionalRotation(0) // 角度
.additionalRotation(90) // 角度
.previewSize(recognizeViewModel.loadPreviewSize())
.specificCameraId(previewConfig.rgbCameraId)
.isMirror(true)
@@ -420,6 +422,7 @@ class SecondaryScreenPresentation(
}
fun resumeCamera() {
Timber.d("resumeCamera")
isRecognition = true
if (rgbCameraHelper != null && rgbCameraHelper!!.isStopped) {
rgbCameraHelper!!.start()
@@ -427,6 +430,7 @@ class SecondaryScreenPresentation(
}
fun pauseCamera() {
Timber.d("pauseCamera")
isRecognition = false
recognizeViewModel.onPreviewFrame(ByteArray(1382400), true)