From 40d41d1afb17feff4f91bc287f034cb07c644ab9 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 19 Jan 2026 14:32:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=9E=E6=97=B6=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/LoginByFaceActivity.kt | 67 +++++++---- .../com/sw/platecabinet/adapter/LogAdapter.kt | 30 +++++ app/src/main/res/drawable/ic_log_hide.png | Bin 0 -> 1931 bytes app/src/main/res/drawable/ic_log_show.png | Bin 0 -> 2250 bytes .../main/res/drawable/shape_white_circle.xml | 5 + .../main/res/layout/activity_login_face.xml | 105 ++++++++++-------- .../main/res/layout/list_item_log_info.xml | 23 ++++ 7 files changed, 163 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/com/sw/platecabinet/adapter/LogAdapter.kt create mode 100644 app/src/main/res/drawable/ic_log_hide.png create mode 100644 app/src/main/res/drawable/ic_log_show.png create mode 100644 app/src/main/res/drawable/shape_white_circle.xml create mode 100644 app/src/main/res/layout/list_item_log_info.xml 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 0000000000000000000000000000000000000000..718fc795155dd4362a472adc2a3fd6151505880d GIT binary patch literal 1931 zcmbtTeN>ZW6rUDK%8*P)4y`#HQ`!gHKwym#!i1?)kR_W6wC#O2USS_?FK%L5CTKDa zvq>P#qcT=eAi_on8Q=#~aht%hqZEQ30$X4tcsikIy(29v|EfQpk9(i{{GR*#?(ZH* zUZ04bgPnsyq0roqkpo#~Xf`IULe*Va>_Lp@WpTVX6so~6cS_`g z*e|G(gc=me|Gan1xTvfKP^g(T5MKZbcWt=E5=f+*}A?N=4ELF#tr6#UchkrqKWq zSp+a>WPrf{A|q%~bSX`Yf0CeF_2=^n&0`i2KBzj8ib|t|c@svy#Ee&iB3P;BE0sBH z9wbpKHA*RrOM?`EQmerwXDMMNZW9D*K{bvRMhT7og#Ssii|Ekg7Nb;UMVadB^ZcsxYQYmj)*fbXPU%qE#I-NVB z2R1^~6ZLqd^rr$r1tL2wqAxAKp%IZb#7&6f>oV^2ZK>viFJHJzEcyW#H``k6H2DKP zpL|uH^p$V0*%v*(Qa_Vmsnz30Q3M|-@rUQRkgn&z`~C|6j8ABed3$$(kUP8TxYgWU zt=}G4cc%a7o!4y@<+=BNyV=tF-Hzc0{RQXyceX{$pKgd}Pn%_}mQJ=c1amWXQ$@=i z>WJj*@|YY<$;WP=Yg^lYs|+EWC?-_FA6Oz?W@}%d{`dpe5o=BfoJGQZF-T}tV#+{} z^ke<*%wLFvT{usNfd3JLa3@Ufw1#7HyXlNFQsx@0p7W-O>PfR*C(V_l>?hGDE{&Tk zbHyp?CB5AW?u0mHwzI79qBGdBu%TK}TEUS`u5o)Bs_j<}Hh%3~>KGUB(;`iF*<`Z2 zNN{x(V;S%8Ls?4<=9?SaYzIg|1fHHlrt{n(wlUH?yZIAA_R2#;y#hDB%k)s%8?d%w zm}C2lWauzrbbX@?N08CKh{Mw~TeQw$Yu_S0c9ddkCk@K)muHn)H^My-n^N?aOCviMl zqMKqfkR0NaE#yd3*Z2X;A#n=YWo*1r8@u*)|B_ah-%^K^yWeicmQ$b_p|%sr3O|2YolC-2(l55`J{TT}5uI$2zSa7@TM#~T zu8V1%B6y5~{C7`Z_oFyo;oi2JmohWmW6~wUxi-iR*0wz7Mgc(AuBo5yayzPzmb zmaLcHsTBZ4-20s@wxdvxe=Af|o3r!o9!zR2d59r@eFhD%+4LYdZ#}2L1G1_96PK&GoC@t-~Y2 zkY!7P0^i%liwxZM^5mDl=Fhv@y-ss>R{0HioAM<2g0moqPcdxRmlry*-%PsJL5yqt zXh*Q@^FFMj#}8z`8##PdP$*rYG2T8F{^+@i`fJTC&B6==A**T3$vGN2Xe=)B$!gP8 zrf*+x>a)s%Vp`xk15|OZFKbj_D->Rm~^-p54~d b-b)YBxJz>k3({-udTlOeeL~%;x8DC9a~2>B literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a9bc26259b00684d42afd62b87720dfacdb74cff GIT binary patch literal 2250 zcmV;*2sQVKP)3e?W;@STYPh4%?a9zFY{fmV{wiv#;D;(oDd^-v z0E)knp;{$bkU&sfs&Dtbj0&S&jOppE?1qRzdcc)Wz;Hyi$@ZQYOF|s@n0A zadDy!aEv5Lq)LFpRjrF9lfrd6&@PhXkRkzgQ`sxKD!EHy!SYgmQ__2+Kmdxrjj zxIx+9Q)0o}Qr<&S1jl)+xN*eyy|w>RNpI0-0-Ud`A0@HiD=Aa_zttAOHuim4+%e)i zKOskq&~dxFuLNLb?i^!Qf0I51{!VQfzSjm_x;%Hi{j#{ZK(qX{cf zW!66WK!Ev`7UuVv>ea`};KJesZMV4f;R;iqB0RONJho zvUP|klTtA1c%*di>^rv5W_(xU7v2eQn^L!{#DZ6(T<0oYW<$Z~7tpN z{cQ0}fJ>C7LnRh4gk!j8v9ahfGN>|?{O>W()E6#9)l44a9?>fSScY|)F*qi1DA3PF zJB#`+Ql^h#lSxvUforv8KZ!edB)|d6l64^_)3_AobJ;cxo+acg^OvzBZdcb?oowvJ zrtXaZJIa0Qty!5&G10^Getd3280J9&YhTaHU}K3Jcp?Ca;T}EXXiI{4u=7ca!Gv^+ zx0I_Mmf1ocQ>&`qsGb)Btga|2e%V8t+C3{+`hEMXd)nEE&nFwZnp^su2^Lq|IXn<`yh{%+PI{0NmK&2G0yfMr@$? zyu@jQnw#D4%ab}kRorphR<^C7O#*OB*LtN)BDkaW0v~!NtOwvsV0D`dNmf5u?P}?_ zMF7^xQT#=WULGfX9{f<#ORyA;wFDOD=auq<5*C%HX%=k|U}=TGaBo$$7I0z2T{Mf0 zM_pDEv8u@88Y$1zL9o?o0z;k=d^6|bMi+?vu`D{rlU|k_Zu*9>Klp%qdIhgdP zrU^g*+Z&x`ij=o_8qM6R^Hab@p2bmKc2Vb|xpE&(65twn!3CU}%3wWyoeQVR9dxY7 zq7W_)Ep9MuZtVHPrU-DBBIE*2O=Ymuis9Zrl`Z7{i6vGfCWqIw5+i4VZ|8(x=@WMxx!+JpxvJ8n3BYPxX0)pIj~+{_NXRFA z$wWR?oW%U6S_@eFz+{@mW~lBY3BXGl80!!1aF(4U;?-HUr@rZR1xV~_OyKr8lWHcT zGUZ7TfY-B7eCx}TSkCoCnR6LzXDJ&Od6rNYlrp2Mb=8iINf3Y+Gg17NjNY6seNJg= zvc?^Xo?NIYM_~_dJ%&O-MFP3y5kanw{%$VUhx}dT?;VH=|sP{mYB#yDzPFHTg4#(KmjF1-%GRpFsjjxOnHVzZQ#GIHQG?p48J7UHI}Sr183+RS zs6%I71OYlry^oHA06ywa>P6E#f&fit*!l5;0L}~4w0l8-rZepP_(1^Y1!~&8AVAX@ zc7FUIfb#-1?OqU|=?ptReh|QEf!cB_2+&rho%Rz1a9WtQ+zJA;m1(E_1Oc2DrY*OE z0BvR3X+J>#r-fKnRePw5Wrbs+IA-h(00b1^%n$iR*<&c2?Dg8acBJn0h|@2 zZFhnIZD-tBe?b6e1!>!zAVAw0ch+AJz)3;6aw7=PRpy=a8w7Ath_2iS0(6ymC;bKi zoD`xfH-Z3NW!_1@K>#O(=*o>CKv$V}(r*x;<3e=Z{l5SJ0RR7NPUFk~000I_L_t&o Y09Uck0Utp#MF0Q*07*qoM6N<$f*n8@!T + + + + \ 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