This commit is contained in:
mazengfei
2026-01-19 17:55:16 +08:00
parent 3b51e6f3f2
commit f473d1f174
6 changed files with 122 additions and 91 deletions
@@ -63,7 +63,7 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
// } // }
// } // }
}.start() }.start()
viewModel.getUserFaceCache() // viewModel.getUserFaceCache()
viewModel.getDeviceConfig { deviceConfig -> viewModel.getDeviceConfig { deviceConfig ->
runOnUiThread { runOnUiThread {
if (deviceConfig == null) { if (deviceConfig == null) {
@@ -53,6 +53,7 @@ import com.sw.platecabinet.model.response.EquipmentUserInfo
import com.sw.platecabinet.socket.LanServer import com.sw.platecabinet.socket.LanServer
import com.sw.platecabinet.socket.LanServerListenerImpl import com.sw.platecabinet.socket.LanServerListenerImpl
import com.sw.platecabinet.socket.TcpClient import com.sw.platecabinet.socket.TcpClient
import com.sw.platecabinet.utils.Debouncer
import com.sw.platecabinet.utils.IntervalExecutor import com.sw.platecabinet.utils.IntervalExecutor
import com.sw.platecabinet.utils.PermissionHelper import com.sw.platecabinet.utils.PermissionHelper
import com.sw.platecabinet.utils.PlateUtils import com.sw.platecabinet.utils.PlateUtils
@@ -99,8 +100,8 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
} }
} }
private var logList: MutableList<String> = mutableListOf() // private var logList: MutableList<String> = mutableListOf()
private val logAdapter by lazy { LogAdapter(logList) } // private val logAdapter by lazy { LogAdapter(logList) }
override fun initialize() { override fun initialize() {
instance = this instance = this
@@ -126,23 +127,26 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
// binding.btnCollectFace.setOnClickListener { collectFace() } // binding.btnCollectFace.setOnClickListener { collectFace() }
binding.rvLogInfo.let { // binding.rvLogInfo.let {
it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true) // it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)
it.adapter = logAdapter // it.adapter = logAdapter
} // }
//
binding.btnLogState.let { // binding.btnLogState.let {
it.tag = false // it.tag = false
it.setImageResource(R.drawable.ic_log_show) // it.setImageResource(R.drawable.ic_log_show)
it.setOnClickListener { v -> // it.setOnClickListener { v ->
binding.rvLogInfo.visible() // binding.rvLogInfo.run {
val state = it.tag.toString().toBooleanStrictOrNull() ?: false // val state = it.tag.toString().toBooleanStrictOrNull() ?: false
it.tag = state // if (state) visible() else gone()
it.setImageResource( // }
if (state) R.drawable.ic_log_hide else R.drawable.ic_log_show // val state = it.tag.toString().toBooleanStrictOrNull() ?: false
) // it.tag = state
} // it.setImageResource(
} // if (state) R.drawable.ic_log_hide else R.drawable.ic_log_show
// )
// }
// }
} }
private fun checkCameraPermission() { private fun checkCameraPermission() {
@@ -230,6 +234,10 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.recognizeUserId.observe(this, Observer { result: CompareResult? -> recognizeViewModel.recognizeUserId.observe(this, Observer { result: CompareResult? ->
Timber.i("recognizeUserId observe userId = ${result?.faceEntity?.userName}") Timber.i("recognizeUserId observe userId = ${result?.faceEntity?.userName}")
// if (result?.faceEntity == null) {
// collectFace()
// return@Observer
// }
currentUserId = result?.faceEntity?.userName currentUserId = result?.faceEntity?.userName
// viewModel.getUserInfoById(memberId = userId) // viewModel.getUserInfoById(memberId = userId)
// ToastUtils.showToast(currentUserId) // ToastUtils.showToast(currentUserId)
@@ -263,33 +271,38 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
} }
private var currentPlateInfo: EquipmentUserInfo? = null private var currentPlateInfo: EquipmentUserInfo? = null
private var debouncer = Debouncer(5000)
/** /**
* 打开餐盘柜 * 打开餐盘柜
*/ */
private fun openPlate(userId: String?) { private fun openPlate(userId: String?) {
Log.d(TAG, "openPlate: userId=$userId") debouncer.debounce {
getPlateData { items -> Log.d(TAG, "openPlate: userId=$userId")
Log.d(TAG, "openPlate: items:${Gson().toJson(items)}") getPlateData { items ->
// 未查询到当前用户,查询第一个未绑定的餐盘 Log.d(TAG, "openPlate: items:${Gson().toJson(items)}")
val item = items.firstOrNull { it.plateNumber.isNullOrEmpty().not() } // 未查询到当前用户,查询第一个未绑定的餐盘
Log.d(TAG, "openPlate: item2:${item}") val item = items.firstOrNull { it.plateNumber.isNullOrEmpty().not() }
if (item == null) { Log.d(TAG, "openPlate: item2:${item}")
//暂无餐盘 if (item == null) {
ToastUtils.showToast("暂无餐盘,请联系管理人员!") //暂无餐盘
goInitActivity() ToastUtils.showToast("暂无餐盘,请联系管理人员!")
return@getPlateData goInitActivity()
} return@getPlateData
Log.d(TAG, "openPlate: item3:${item}") }
item.faceId = userId Log.d(TAG, "openPlate: item3:${item}")
item.updateTime = DateTimeUtils.getDateTimeString() item.faceId = userId
item.plateNumber = null item.updateTime = DateTimeUtils.getDateTimeString()
//打开柜子 item.plateNumber = null
PlateUtils.open(this, item.equipmentBoxCode, false) //打开柜子
PlateUtils.open(this, item.equipmentBoxCode, false)
currentPlateInfo = item currentPlateInfo = item
MyApp.plateList = items MyApp.plateList = items
SpTool.savePlateData(items) SpTool.savePlateData(items)
debouncer.reset()
}
} }
} }
@@ -594,7 +607,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------") loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------")
if (isFirstOpen) return if (isFirstOpen) return
loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------") loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------")
logAdapter.addData("collectFace: ----------22222222,isFirstOpen=false-----------")
if (facePreviewInfoList.isNullOrEmpty()) { if (facePreviewInfoList.isNullOrEmpty()) {
loadLogInfo("collectFace: ----------3,未检测到人脸信息-----------") loadLogInfo("collectFace: ----------3,未检测到人脸信息-----------")
return return
@@ -605,8 +617,17 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY) recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY)
loadLogInfo("collectFace: ----------5,人脸采集中-----------") loadLogInfo("collectFace: ----------5,人脸采集中-----------")
getFaceData { faceData -> getFaceData { faceData ->
userFaceInfo = null // userFaceInfo = null
saveFaceInfo(faceData) Thread {
val faceDao = FaceDatabase.getInstance(this).faceDao()
val entity = faceDao.queryByUserName(tempUserId)
if (entity != null) {
//已存在用户
loadLogInfo("collectFace,saveFaceInfo: ----------9,数据库已存在该人脸数据-----------")
return@Thread
}
saveFaceInfo(faceData)
}.start()
} }
} }
@@ -628,12 +649,15 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
// toast("您已采集过人脸信息") // toast("您已采集过人脸信息")
// return@startIntervalTask // return@startIntervalTask
// } // }
loadLogInfo("collectFace,getFaceData: ----------6,正在获人脸取特征数据") // loadLogInfo("collectFace,getFaceData: ----------6,正在获人脸取特征数据")
if (userFaceInfo == null) { if (userFaceInfo == null) {
return@startIntervalTask return@startIntervalTask
} }
loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------") loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------")
val faceData = Base64.encode(userFaceInfo!!.faceFeature!!.featureData) val faceData: String? = Base64.encode(userFaceInfo?.faceFeature?.featureData)
if (faceData.isNullOrBlank()) {
return@startIntervalTask
}
block(faceData) block(faceData)
checkFaceJob?.cancel() checkFaceJob?.cancel()
job?.cancel() job?.cancel()
@@ -643,7 +667,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
private fun loadLogInfo(msg: String) { private fun loadLogInfo(msg: String) {
Log.d(TAG, msg) Log.d(TAG, msg)
logAdapter.addData(msg) // logAdapter.addData(msg)
} }
private var facePreviewInfoList: MutableList<FacePreviewInfo>? = null private var facePreviewInfoList: MutableList<FacePreviewInfo>? = null
@@ -673,43 +697,42 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
} }
private fun saveFaceInfo(faceData: String) { private fun saveFaceInfo(faceData: String) {
Thread { try {
try { checkFaceJob?.cancel()
loadLogInfo("collectFace,saveFaceInfo: ----------8,保存人脸取特征数据-----------")
val faceDao = FaceDatabase.getInstance(this).faceDao() sendFaceData(faceData)
val entity = faceDao.queryByUserName(tempUserId) loadLogInfo("collectFace,saveFaceInfo: ----------12,人脸数据发送完成时间:${DateTimeUtils.getDateTimeString()}-----------")
if (entity != null) {
//已存在用户 runOnUiThread {
loadLogInfo("collectFace,saveFaceInfo: ----------9,数据库已存在该人脸数据-----------") openPlate(tempUserId)
return@Thread
}
val faceEntity = FaceEntity(
tempUserId,
null,
Base64.decode(faceData)
).also {
it.userType = "2"
}
faceDao.insert(faceEntity)
loadLogInfo("collectFace,saveFaceInfo: ----------10,人脸数据保存完成-----------")
recognizeViewModel.refreshFaceList()
loadLogInfo("collectFace,saveFaceInfo: ----------11,刷新人脸数据-----------")
sendFaceData(faceData)
loadLogInfo("collectFace,saveFaceInfo: ----------12,人脸数据发送完成时间:${DateTimeUtils.getDateTimeString()}-----------")
loadLogInfo("---------------------------------")
collectCount = 0
} catch (e: Exception) {
e.printStackTrace()
loadLogInfo("collectFace,saveFaceInfo: ----------13,人脸采集异常:${e.message}-----------")
collectCount++
if (collectCount <= 5) {
collectFace()
} else {
loadLogInfo("collectFace,saveFaceInfo: ----------14,${collectCount}次人脸采集异常:${e.message}-----------")
ToastUtils.showToast("人脸采集异常:${e.message}")
}
} }
}.start()
loadLogInfo("collectFace,saveFaceInfo: ----------8,保存人脸取特征数据-----------")
val faceDao = FaceDatabase.getInstance(this).faceDao()
val faceEntity = FaceEntity(
tempUserId,
null,
Base64.decode(faceData)
).also {
it.userType = "2"
}
faceDao.insert(faceEntity)
loadLogInfo("collectFace,saveFaceInfo: ----------10,人脸数据保存完成-----------")
recognizeViewModel.refreshFaceList()
loadLogInfo("collectFace,saveFaceInfo: ----------11,刷新人脸数据-----------")
loadLogInfo("---------------------------------")
collectCount = 0
} catch (e: Exception) {
e.printStackTrace()
loadLogInfo("collectFace,saveFaceInfo: ----------13,人脸采集异常:${e.message}-----------")
collectCount++
if (collectCount <= 5) {
collectFace()
} else {
loadLogInfo("collectFace,saveFaceInfo: ----------14,${collectCount}次人脸采集异常:${e.message}-----------")
ToastUtils.showToast("人脸采集异常:${e.message}")
}
}
} }
private var collectCount = 0; private var collectCount = 0;
@@ -1,11 +1,13 @@
package com.sw.platecabinet.adapter package com.sw.platecabinet.adapter
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.sw.platecabinet.databinding.ListItemLogInfoBinding import com.sw.platecabinet.databinding.ListItemLogInfoBinding
class LogAdapter(var list: MutableList<String>) : RecyclerView.Adapter<LogAdapter.ViewHolder> { class LogAdapter(var list: MutableList<String>) : RecyclerView.Adapter<LogAdapter.ViewHolder>() {
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.binding.tvLogText.text = list[position] holder.binding.tvLogText.text = list[position]
@@ -23,8 +25,10 @@ class LogAdapter(var list: MutableList<String>) : RecyclerView.Adapter<LogAdapte
RecyclerView.ViewHolder(binding.root) RecyclerView.ViewHolder(binding.root)
fun addData(logInfo: String) { fun addData(logInfo: String) {
list.add(logInfo) Handler(Looper.getMainLooper()).post {
notifyDataSetChanged() // list.add(logInfo)
// notifyDataSetChanged()
}
} }
} }
@@ -115,7 +115,11 @@ class CrashHandler private constructor(private val context: Context) :
collectDeviceInfo(this) collectDeviceInfo(this)
// 收集应用日志 // 收集应用日志
append("\n\n").append(collectLogs()) try {
append("\n\n").append(collectLogs())
} catch (e: OutOfMemoryError) {
append("collectLogs发生OutOfMemoryError:${e.message}")
}
// 收集线程和异常信息 // 收集线程和异常信息
append("\n\n========== Thread & Exception Info ==========\n") append("\n\n========== Thread & Exception Info ==========\n")
@@ -12,7 +12,7 @@
android:layout_marginHorizontal="20dp" android:layout_marginHorizontal="20dp"
android:layout_marginVertical="10dp" android:layout_marginVertical="10dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="26sp" android:textSize="20sp"
tools:text="log" /> tools:text="log" />
<View <View
@@ -473,9 +473,7 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback {
public void onRecognized(CompareResult compareResult, Integer live, boolean similarPass) { public void onRecognized(CompareResult compareResult, Integer live, boolean similarPass) {
Disposable disposable = Observable.just(true).observeOn(AndroidSchedulers.mainThread()).subscribe(aBoolean -> { Disposable disposable = Observable.just(true).observeOn(AndroidSchedulers.mainThread()).subscribe(aBoolean -> {
if (similarPass) { if (similarPass) {
if (recognizeUserId != null) { recognizeUserId.postValue(compareResult);
recognizeUserId.postValue(compareResult);
}
boolean isAdded = false; boolean isAdded = false;
List<CompareResult> compareResults = compareResultList.getValue(); List<CompareResult> compareResults = compareResultList.getValue();
if (compareResults != null && !compareResults.isEmpty()) { if (compareResults != null && !compareResults.isEmpty()) {
@@ -497,6 +495,8 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback {
getFaceItemEventMutableLiveData().postValue(new FaceItemEvent(compareResults.size() - 1, EventType.INSERTED)); getFaceItemEventMutableLiveData().postValue(new FaceItemEvent(compareResults.size() - 1, EventType.INSERTED));
} }
} }
} else {
// recognizeUserId.postValue(new CompareResult(null, 0f));
} }
}); });
} }