优化识别后未离开多次切换模式导致的不再识别问题

This commit is contained in:
2025-12-22 14:18:46 +08:00
parent 960b429e69
commit f080a8b73c
3 changed files with 84 additions and 45 deletions
@@ -692,7 +692,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
val weight = lastWeight
lastWeight = 0.0
presentation?.hideRecImage()
recognizeByWeight(weight, true)
presentation?.step1FoodRecognizing()
binding.root.postDelayed({
recognizeByWeight(weight, true)
},500)
}
isRefreshPage = !isRefreshPage
}
@@ -748,6 +752,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
foodWeight: Int,
eatWeight: Int,
eatNum: Int,
userId: String?,
block: () -> Unit
) {
Timber.tag(TAG).d("foodWeight=$foodWeight,eatWeight=$eatWeight")
@@ -769,7 +774,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
eatWeight = eatWeight,
//根据specId对应规格重量计算
eatNum = eatNum,
userId = null,
userId = userId,
notPay = chargeMode != 0,
//即放即取-1,称重-2
mode = if (pickupMode == 1) 1 else 2
@@ -823,6 +828,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
isStartRecognize = false
presentation?.hideNutritionView(event.chargeMode)
// presentation?.cancel()
if (event.chargeMode == 1) {
presentation?.let {
it.onStop()
it.setupArcCamera()
}
}
}
private var isRefreshPage = false
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -868,7 +880,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
foodInfo = checkedItem!!,
foodWeight = foodWeight.roundToInt(),
eatWeight = eatWeight.roundToInt(),
eatNum = eatNum
eatNum = eatNum,
userId = null,
) {
// TODO: 暂不关闭首页副屏
//presentation?.dismiss()
@@ -3,6 +3,7 @@ package com.sw.dualscreen.activity.fragment
import android.view.LayoutInflater
import com.sw.dualscreen.GlobalKey
import com.sw.dualscreen.R
import com.sw.dualscreen.activity.SettingActivity
import com.sw.dualscreen.databinding.FragmentBusinessBinding
import com.sw.dualscreen.model.response.ChargeModeEvent
import com.sw.dualscreen.sdk.SensorScaleUtils
@@ -37,7 +38,7 @@ class BusinessFragment: BaseFragment<FragmentBusinessBinding>() {
binding.btnClearZero.setOnClickListener {
SensorScaleUtils.tare()
}
binding.btnConfirm.setOnClickListener {
binding.btnConfirm.setOnClickListener { v ->
if (binding.rgCharge.checkedRadioButtonId == -1) {
ToastUtils.showToast("请设置计费模式")
return@setOnClickListener
@@ -59,8 +60,14 @@ class BusinessFragment: BaseFragment<FragmentBusinessBinding>() {
val pickupMode = if (binding.rgTakeFood.checkedRadioButtonId == R.id.rbPickAndPlace) 0 else 1
SPUtil.getInstance().put(GlobalKey.KEY_PICKUP_MODE, pickupMode)
ToastUtils.showToast("设置已保存")
activity?.finish()
//ToastUtils.showToast("设置已保存")
(activity as SettingActivity).let {
it.showWaitingDialog("设置保存中")
v.postDelayed({
it.hideWaitingDialog()
it.finish()
}, 1000)
}
}
SensorScaleUtils.addWeightListener { value ->
val realWeight = (value * 1000).roundToInt()
@@ -19,6 +19,8 @@ import android.view.ViewTreeObserver
import android.widget.FrameLayout
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
@@ -109,6 +111,8 @@ class MainScreenPresentation(
var currentUserId: String? = null
var facePreviewInfoList: MutableList<FacePreviewInfo>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = PresentationMainScreenBinding.inflate(layoutInflater)
@@ -116,7 +120,10 @@ class MainScreenPresentation(
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
window?.setBackgroundDrawableResource(android.R.color.white)
initView()
setupArcCamera()
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
if (chargeMode == 1) {
setupArcCamera()
}
registerDataChange()
startTime = System.currentTimeMillis()
}
@@ -226,7 +233,7 @@ class MainScreenPresentation(
/**
* 启用虹软人脸失败
*/
private fun setupArcCamera() {
fun setupArcCamera() {
initArcViewModel()
initArcView()
openRectInfoDraw = true
@@ -268,7 +275,6 @@ class MainScreenPresentation(
LightManager.openGreenLight()
currentStep = 3
stepChangeCallback(currentStep)
//根据接口数据更新热量数据--------------------------
userViewModel.getUserNutritionData(userId = userId) { nutrition ->
activity.runOnUiThread {
@@ -384,13 +390,18 @@ class MainScreenPresentation(
return num?.roundToInt() ?: 0
}
private var isLoadUnbilledMode = false
/**
* 餐品识别成功,不计费模式
*/
fun loadUnbilledMode() {
isLoadUnbilledMode = true
Timber.tag(TAG).d("loadUnbilledMode")
binding.calorieInclude.root.gone()
binding.nutritionInclude.root.visible()
binding.ivPreviewImage.gone()
binding.flCameraView.visible()
binding.ivFaceRecMask.gone()
binding.tvFaceTip.gone()
@@ -406,10 +417,14 @@ class MainScreenPresentation(
// -------------------------------------------------
// 删除userNutritionData,改为userNutrition
calculateNutrition(recognitionWeight - lastWeight)
binding.root.postDelayed({
isLoadUnbilledMode = false
}, 10000)
}
private var isFirstOpen = true
var startTime = 0L
/**
* 餐品识别中
*/
@@ -519,6 +534,7 @@ class MainScreenPresentation(
// 当前食物信息
private var currentFood: FoodInfo? = null
fun updateFood(foodInfo: FoodInfo?) {
//if (isLoadUnbilledMode) return
Timber.tag(TAG).d("main,updateFood,耗时:${System.currentTimeMillis() - startTime}")
startTime = System.currentTimeMillis()
currentFood = foodInfo
@@ -546,7 +562,7 @@ class MainScreenPresentation(
} else {
//不计费
//开启人脸识别
if (currentStep == 1) {
if (currentStep == 1 || binding.tvFaceTip.isVisible.not()) {
step2FaceRecognizing(foodInfo)
}
}
@@ -713,15 +729,11 @@ class MainScreenPresentation(
step1FoodRecognizing()
}
override fun onStop() {
if (rgbCameraHelper != null) {
rgbCameraHelper!!.release()
rgbCameraHelper = null
}
if (irCameraHelper != null) {
irCameraHelper!!.release()
irCameraHelper = null
}
public override fun onStop() {
rgbCameraHelper?.release()
rgbCameraHelper = null
irCameraHelper?.release()
irCameraHelper = null
recognizeViewModel.destroy()
super.onStop()
}
@@ -740,7 +752,7 @@ class MainScreenPresentation(
recognizeViewModel.onPreviewFrame(ByteArray(1382400), true)
}
private var recognizeTime = 0L
private fun initArcViewModel() {
recognizeViewModel.setLiveType(livenessType)
recognizeViewModel.ftInitCode.observe(activity, Observer { ftInitCode: Int? ->
@@ -786,26 +798,22 @@ class MainScreenPresentation(
recognizeViewModel.recognizeUserId.observe(
activity,
Observer { compareResult: CompareResult ->
if (currentStep != 2 || System.currentTimeMillis() - recognizeTime <= 2000) {
//忽略非识别中及两秒内的再次识别
return@Observer
}
recognizeTime = System.currentTimeMillis()
activity.runOnUiThread {
activity.showWaitingDialog("加载中,请稍后……")
}
Timber.tag(TAG)
.i("recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}")
.i("recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}, step = $currentStep")
recognitionTime = System.currentTimeMillis()
recognitionWeight = lastWeight
lastFaceTrackId = compareResult.trackId
val faceEntity = compareResult.faceEntity
val userId = faceEntity.userName
currentUserId = userId
// if (TextUtils.equals(userId, "2")) {
// //解决识别出现recognizeStatus = 2待重试的问题
// activity.runOnUiThread {
// ToastUtils.showToast("一开始就在屏幕内发现无法识别,从屏幕外进入就可以识别")
// activity.hideWaitingDialog()
// }
// //userViewModel.getUserFaceCache()
// return@Observer
// }
if (userId == null) return@Observer
//ToastUtils.showToast("人脸识别成功,userId = $userId")
if (currentFood == null) {
@@ -962,18 +970,17 @@ class MainScreenPresentation(
})
}
@RequiresApi(api = Build.VERSION_CODES.Q)
override fun onPreview(nv21: ByteArray?, camera: Camera?) {
if (!isRecognition) {
return
}
binding.dualCameraFaceRectView.clearFaceInfo()
val facePreviewInfoList: MutableList<FacePreviewInfo?>? =
recognizeViewModel.onPreviewFrame(nv21, true)
facePreviewInfoList = recognizeViewModel.onPreviewFrame(nv21, true)
if (facePreviewInfoList != null && rgbFaceRectTransformer != null) {
drawPreviewInfo(facePreviewInfoList)
drawPreviewInfo(facePreviewInfoList!!)
}
recognizeViewModel.clearLeftFace(facePreviewInfoList)
//recognizeViewModel.clearLeftFace(facePreviewInfoList)
clearLeftFaceData()
}
override fun onCameraClosed() {
@@ -1111,10 +1118,10 @@ class MainScreenPresentation(
*
* @param facePreviewInfoList RGB画面的实时人脸信息
*/
private fun drawPreviewInfo(facePreviewInfoList: MutableList<FacePreviewInfo?>) {
private fun drawPreviewInfo(facePreviewInfoList: MutableList<FacePreviewInfo>) {
// Timber.tag(TAG).d("drawPreviewInfo facePreviewInfoList = ${facePreviewInfoList.size}, rgbFaceRectTransformer = ${rgbFaceRectTransformer != null}")
if (rgbFaceRectTransformer != null) {
val rgbDrawInfoList: MutableList<DrawInfo?>? = recognizeViewModel.getDrawInfo(
val rgbDrawInfoList: MutableList<DrawInfo>? = recognizeViewModel.getDrawInfo(
facePreviewInfoList,
LivenessType.RGB,
openRectInfoDraw
@@ -1122,15 +1129,24 @@ class MainScreenPresentation(
// 识别成功
binding.dualCameraFaceRectView.drawRealtimeFaceInfo(rgbDrawInfoList)
}
//binding.dualCameraFaceRectView.clearFaceInfo()
//clearLeftFaceData()
val listIsEmpty = facePreviewInfoList.isEmpty()
val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0]!!.trackId else null
val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0].trackId else null
Timber.tag(TAG)
.d("listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId")
if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) {
if (lastFaceTrackId != -1 && currentUserId!=null) {
if (lastFaceTrackId != -1 && currentUserId != null) {
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
Timber.tag(TAG).i("$lastFaceTrackId 用户离开")
lastFaceTrackId = -1
Timber.tag(TAG)
.d("postUserData userNutritionData是否null ${userNutrition == null}, currentFood是否null: ${currentFood == null}currentUserId是否null${currentUserId == null}")
if (userNutrition == null || currentFood == null || currentUserId == null) {
return
}
postUserData()
if (mealPickupMode == 1 || isKeepFaceState) {
step2FaceRecognizing(currentFood!!)
@@ -1144,11 +1160,6 @@ class MainScreenPresentation(
}
fun postUserData() {
Timber.tag(TAG)
.d("postUserData userNutritionData是否null ${userNutrition == null}, currentFood是否null: ${currentFood == null}currentUserId是否null${currentUserId == null}", )
if (userNutrition == null || currentFood == null || currentUserId == null) {
return
}
createOrder()
}
@@ -1173,7 +1184,8 @@ class MainScreenPresentation(
foodInfo = currentFood!!,
foodWeight = lastWeight.roundToInt(),
eatWeight = eatWeight.roundToInt(),
eatNum = activity.getEatNum(eatWeight, currentFood!!.specWeight)
eatNum = activity.getEatNum(eatWeight, currentFood!!.specWeight),
userId = currentUserId
) {
if (MyApp.DEBUG) {
ToastUtils.showToast("订单已生成")
@@ -1182,6 +1194,13 @@ class MainScreenPresentation(
}
}
private fun clearLeftFaceData() {
facePreviewInfoList?.let {
recognizeViewModel.clearLeftFace(facePreviewInfoList!!)
}
facePreviewInfoList = null
}
fun hideNutritionView(chargeMode: Int) {
binding.nutritionInclude.root.gone()
binding.calorieInclude.root.gone()