diff --git a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt index faf4446..923daae 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt @@ -15,6 +15,7 @@ import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager import com.arcsoft.face.ErrorInfo import com.google.gson.Gson import com.sw.platecabinet.socket.TcpClientListenerImpl @@ -42,6 +43,7 @@ import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel.REGISTER_STATUS_R import com.sw.platecabinet.GlobalData import com.sw.platecabinet.MyApp import com.sw.platecabinet.R +import com.sw.platecabinet.adapter.LogAdapter import com.sw.platecabinet.databinding.ActivityLoginFaceBinding import com.sw.platecabinet.databinding.ItemTitleTimeBinding import com.sw.platecabinet.ext.gone @@ -97,6 +99,8 @@ class LoginByFaceActivity : BaseActivity(), } } + private var logList: MutableList = mutableListOf() + private val logAdapter by lazy { LogAdapter(logList) } override fun initialize() { instance = this @@ -121,6 +125,19 @@ class LoginByFaceActivity : BaseActivity(), // binding.btnCollectFace.setOnClickListener { collectFace() } + + binding.rvLogInfo.let { + it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true) + it.adapter = logAdapter + } + + binding.btnLogState.let { + it.tag = false + it.setOnClickListener { v -> + binding.rvLogInfo.visible() + it.tag = it.tag.toString().toBoolean().not() + } + } } private fun checkCameraPermission() { @@ -569,38 +586,27 @@ class LoginByFaceActivity : BaseActivity(), } private fun collectFace() { - Log.d(TAG, "collectFace: -----------开始采集人脸111111----------") + loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------") if (isFirstOpen) return - Log.d(TAG, "collectFace: ----------22222222-----------") + loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------") + logAdapter.addData("collectFace: ----------22222222,isFirstOpen=false-----------") if (facePreviewInfoList.isNullOrEmpty()) { - //ToastUtils.showToast("未检测到人脸信息") - Log.d(TAG, "collectFace: ----------33333333-----------") - Log.d(TAG, "collectFace: 未检测到人脸信息") + loadLogInfo("collectFace: ----------3,未检测到人脸信息-----------") return } - Log.d(TAG, "collectFace: ----------44444444-----------") -// if (currentUserId != null) { -// currentUserId = null -//// ToastUtils.showToast("您已采集过人脸信息") -// return -// } + loadLogInfo("collectFace: ----------4,检测到人脸信息-----------") currentUserId = null userFaceInfo = null recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY) - Log.d(TAG, "collectFace: 人脸采集中……") -// binding.tvFaceTip.gone() -// binding.btnCollectFace.invisible() -// binding.layoutState.visible() -// binding.pbCollectLoading.visible() -// binding.tvCollectState.text = "采集中......" + loadLogInfo("collectFace: ----------5,人脸采集中-----------") getFaceData { faceData -> - Log.d("LoginByFaceActivity", "collectFace,faceData: $faceData") userFaceInfo = null saveFaceInfo(faceData) } } private fun sendFaceData(faceData: String) { + loadLogInfo("collectFace,sendFaceData: ----------11,发生人脸数据-----------") Log.d(TAG, "collectFace,sendFaceData: ---------------------------") // 给某个客户端发送 val jsonObject = JSONObject().also { @@ -617,16 +623,22 @@ class LoginByFaceActivity : BaseActivity(), // toast("您已采集过人脸信息") // return@startIntervalTask // } + loadLogInfo("collectFace,getFaceData: ----------6,正在获人脸取特征数据") if (userFaceInfo == null) { return@startIntervalTask } + loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------") val faceData = Base64.encode(userFaceInfo!!.faceFeature!!.featureData) block(faceData) checkFaceJob?.cancel() job?.cancel() } } + } + private fun loadLogInfo(msg: String) { + Log.d(TAG, msg) + logAdapter.addData(msg) } private var facePreviewInfoList: MutableList? = null @@ -656,13 +668,14 @@ class LoginByFaceActivity : BaseActivity(), } private fun saveFaceInfo(faceData: String) { - Log.d(TAG, "collectFace,saveFaceInfo: $faceData") Thread { try { + loadLogInfo("collectFace,saveFaceInfo: ----------8,保存人脸取特征数据-----------") val faceDao = FaceDatabase.getInstance(this).faceDao() val entity = faceDao.queryByUserName(tempUserId) if (entity != null) { //已存在用户 + loadLogInfo("collectFace,saveFaceInfo: ----------9,数据库已存在该人脸数据-----------") return@Thread } val faceEntity = FaceEntity( @@ -673,17 +686,21 @@ class LoginByFaceActivity : BaseActivity(), it.userType = "2" } faceDao.insert(faceEntity) + loadLogInfo("collectFace,saveFaceInfo: ----------10,人脸数据保存完成-----------") recognizeViewModel.refreshFaceList() + loadLogInfo("collectFace,saveFaceInfo: ----------11,刷新人脸数据-----------") sendFaceData(faceData) - Log.d(TAG, "collectFace,saveFaceInfo: 人脸采集完成") + loadLogInfo("collectFace,saveFaceInfo: ----------12,人脸数据发送完成时间:${DateTimeUtils.getDateTimeString()}-----------") + loadLogInfo("---------------------------------") collectCount = 0 } catch (e: Exception) { e.printStackTrace() - Log.d(TAG, "collectFace,saveFaceInfo: 人脸采集异常:${e.message}") + loadLogInfo("collectFace,saveFaceInfo: ----------13,人脸采集异常:${e.message}-----------") collectCount++ if (collectCount <= 5) { collectFace() } else { + loadLogInfo("collectFace,saveFaceInfo: ----------14,${collectCount}次人脸采集异常:${e.message}-----------") ToastUtils.showToast("人脸采集异常:${e.message}") } } @@ -709,22 +726,25 @@ class LoginByFaceActivity : BaseActivity(), tcpClient?.setListener(object : TcpClientListenerImpl() { override fun onSendSuccess(json: JSONObject?) { super.onSendSuccess(json) + loadLogInfo("TcpClientListener发送成功:$json") // toast("发送成功") } override fun onSendFailed(json: JSONObject?, e: java.lang.Exception?) { super.onSendFailed(json, e) ToastUtils.showToast("发送失败${e?.message}") + loadLogInfo("TcpClientListener人脸数据发送失败:${e?.message}") } override fun onMessage(json: JSONObject?) { super.onMessage(json) - + loadLogInfo("TcpClientListener收到消息:$json") val type = json?.getInt("type") // 根据服务端消息类型处理删除新增临时用户人脸数据--------------------- when (type) { LanServer.TYPE_ADD_FACE_DATA -> { //采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据 + loadLogInfo("TcpClientListener收到消息,新增用户:采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据") } LanServer.TYPE_CLEAR_FACE_DATA -> { @@ -756,7 +776,8 @@ class LoginByFaceActivity : BaseActivity(), Thread { val faceDao = FaceDatabase.getInstance(this).faceDao() faceDao.deleteTempUserFaceData() - recognizeViewModel.refreshFaceList(); + recognizeViewModel.refreshFaceList() + loadLogInfo("TcpClientListener收到消息,已删除并刷新人脸数据") }.start() } diff --git a/app/src/main/java/com/sw/platecabinet/adapter/LogAdapter.kt b/app/src/main/java/com/sw/platecabinet/adapter/LogAdapter.kt new file mode 100644 index 0000000..c26d005 --- /dev/null +++ b/app/src/main/java/com/sw/platecabinet/adapter/LogAdapter.kt @@ -0,0 +1,30 @@ +package com.sw.platecabinet.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.sw.platecabinet.databinding.ListItemLogInfoBinding + +class LogAdapter(var list: MutableList) : RecyclerView.Adapter { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.binding.tvLogText.text = list[position] + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = + ListItemLogInfoBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + + override fun getItemCount() = list.size + + inner class ViewHolder(var binding: ListItemLogInfoBinding) : + RecyclerView.ViewHolder(binding.root) + + fun addData(logInfo: String) { + list.add(logInfo) + notifyDataSetChanged() + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_log_hide.png b/app/src/main/res/drawable/ic_log_hide.png new file mode 100644 index 0000000..718fc79 Binary files /dev/null and b/app/src/main/res/drawable/ic_log_hide.png differ diff --git a/app/src/main/res/drawable/ic_log_show.png b/app/src/main/res/drawable/ic_log_show.png new file mode 100644 index 0000000..a9bc262 Binary files /dev/null and b/app/src/main/res/drawable/ic_log_show.png differ diff --git a/app/src/main/res/drawable/shape_white_circle.xml b/app/src/main/res/drawable/shape_white_circle.xml new file mode 100644 index 0000000..40d2f69 --- /dev/null +++ b/app/src/main/res/drawable/shape_white_circle.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login_face.xml b/app/src/main/res/layout/activity_login_face.xml index a3e341b..1877e49 100644 --- a/app/src/main/res/layout/activity_login_face.xml +++ b/app/src/main/res/layout/activity_login_face.xml @@ -49,7 +49,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginTop="0dp" - android:background="@drawable/bg_face" + android:scaleType="centerCrop" + android:src="@drawable/bg_face" android:visibility="visible" /> - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + android:layout_height="match_parent" + android:layout_gravity="bottom" + android:overScrollMode="never" + android:visibility="gone" + android:background="@color/black" + tools:listitem="@layout/list_item_log_info" /> + + diff --git a/app/src/main/res/layout/list_item_log_info.xml b/app/src/main/res/layout/list_item_log_info.xml new file mode 100644 index 0000000..8286c17 --- /dev/null +++ b/app/src/main/res/layout/list_item_log_info.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file