From f2bedb777788f5f1a1dcb549d8c405df10310b71 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Wed, 21 Jan 2026 17:58:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sw/platecabinet/activity/BaseActivity.kt | 2 +- .../activity/LoginByFaceActivity.kt | 15 +- .../java/com/sw/platecabinet/utils/L.java | 57 +++ .../sw/platecabinet/utils/SoundPoolUtil.java | 427 ++++++++++++++++++ .../main/res/layout/activity_login_face.xml | 10 + app/src/main/res/raw/success.wav | Bin 0 -> 76044 bytes .../plate/utils/arcface/face/FaceHelper.java | 27 +- .../arcface/face/model/CompareResult.java | 10 + .../arcface/viewmodel/RecognizeViewModel.java | 2 +- 9 files changed, 546 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/sw/platecabinet/utils/L.java create mode 100644 app/src/main/java/com/sw/platecabinet/utils/SoundPoolUtil.java create mode 100644 app/src/main/res/raw/success.wav diff --git a/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt index f491f1a..286e662 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt @@ -424,7 +424,7 @@ abstract class BaseActivity : AppCompatActivity() { // private val initialDelay = 5 * 60 * 1000L // private val dealyMillis = 10 * 60 * 1000L - private val initialDelay = 1 * 60 * 1000L + private val initialDelay = 5 * 60 * 1000L private val dealyMillis = 5 * 60 * 1000L private var taskPageNo = 1 fun startFaceTask() { 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 5698b67..8392492 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt @@ -58,6 +58,7 @@ import com.sw.platecabinet.utils.Debouncer import com.sw.platecabinet.utils.IntervalExecutor import com.sw.platecabinet.utils.PermissionHelper import com.sw.platecabinet.utils.PlateUtils +import com.sw.platecabinet.utils.SoundPoolUtil import com.sw.platecabinet.utils.SpTool import com.sw.platecabinet.utils.countDownByFlow import kotlinx.coroutines.Job @@ -151,6 +152,11 @@ class LoginByFaceActivity : BaseActivity(), // ) // } // } + + + val soundMap = hashMapOf() + soundMap["success"] = R.raw.success + SoundPoolUtil.getInstance().loadR(this, soundMap); } private fun checkCameraPermission() { @@ -246,13 +252,19 @@ class LoginByFaceActivity : BaseActivity(), recognizeViewModel.recognizeUserId.observe(this, Observer { result: CompareResult? -> loadLogInfo("collectFace,recognizeUserId observe userId = ${result?.faceEntity?.userName}") - if (result?.faceEntity == null) { + val similar = result?.similar?:0f + binding.tvSimilarValue.text="$similar" + val similarPass = result?.isSimilarPass?:false + if (similarPass.not()) { loadLogInfo("collectFace,recognizeUserId 未识别到人脸信息,开始采集") isCollectFace = true collectFace() return@Observer } currentUserId = result?.faceEntity?.userName + if (tempUserId != currentUserId) { + SoundPoolUtil.getInstance().play("success", 0) + } // plateEnable = true openPlate(currentUserId) }) @@ -547,6 +559,7 @@ class LoginByFaceActivity : BaseActivity(), }, 1000) return } + binding.tvSimilarValue.text="" isCollectFace = false plateEnable = true collectCount = 0 diff --git a/app/src/main/java/com/sw/platecabinet/utils/L.java b/app/src/main/java/com/sw/platecabinet/utils/L.java new file mode 100644 index 0000000..768cafd --- /dev/null +++ b/app/src/main/java/com/sw/platecabinet/utils/L.java @@ -0,0 +1,57 @@ +package com.sw.platecabinet.utils; + +/** + * Log统一管理类 + */ +public class L { + + private L() { + /* cannot be instantiated */ + throw new UnsupportedOperationException("cannot be instantiated"); + } + + public static boolean isDebug = true;// 是否需要打印bug,可以在application的onCreate函数里面初始化 + private static final String TAG = "mzf"; + + // 下面四个是默认tag的函数 + public static void i(String msg) { + if (isDebug) + android.util.Log.i(TAG, msg); + } + + public static void d(String msg) { + if (isDebug) + android.util.Log.d(TAG, msg); + } + + public static void e(String msg) { + if (isDebug) + android.util.Log.e(TAG, msg); + } + + public static void v(String msg) { + if (isDebug) + android.util.Log.v(TAG, msg); + } + + // 下面是传入自定义tag的函数 + public static void i(String tag, String msg) { + if (isDebug) + android.util.Log.i(tag, msg); + } + + public static void d(String tag, String msg) { + if (isDebug) + android.util.Log.d(tag, msg); + } + + public static void e(String tag, String msg) { + if (isDebug) + android.util.Log.e(tag, msg); + } + + public static void v(String tag, String msg) { + if (isDebug) + android.util.Log.v(tag, msg); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/platecabinet/utils/SoundPoolUtil.java b/app/src/main/java/com/sw/platecabinet/utils/SoundPoolUtil.java new file mode 100644 index 0000000..707e2a1 --- /dev/null +++ b/app/src/main/java/com/sw/platecabinet/utils/SoundPoolUtil.java @@ -0,0 +1,427 @@ +package com.sw.platecabinet.utils; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.SoundPool; +import android.os.Build; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class SoundPoolUtil { + + private static final String TAG = SoundPoolUtil.class.getSimpleName(); + private static SoundPoolUtil mSound; + private SoundPool mSoundPool; + private boolean isLoadC = false; + private Map idCache; + private List sidCache; + + public SoundPoolUtil() { + idCache = new HashMap<>(); + sidCache = new ArrayList<>(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + AudioAttributes aab = new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .setUsage(AudioAttributes.USAGE_MEDIA) + .build(); + mSoundPool = new SoundPool.Builder() + .setMaxStreams(10) + .setAudioAttributes(aab) + .build(); + } else { + mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 8); + } +// mSoundPool = new SoundPool(60, AudioManager.USE_DEFAULT_STREAM_TYPE, 7); + mSoundPool.setOnLoadCompleteListener(new MyOnLoadCompleteListener()); + } + + public static SoundPoolUtil getInstance() { + + synchronized (SoundPoolUtil.class) { + if (mSound == null) { + mSound = new SoundPoolUtil(); + } + } + return mSound; + } + + private int loadCompleteSize = 0; + private LoadCompletion completionListener; + + public void setCompletionListener(LoadCompletion listener) { + this.completionListener = listener; + } + + private class MyOnLoadCompleteListener implements SoundPool.OnLoadCompleteListener { + + @Override + public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { + loadCompleteSize++; + + L.e("loadSize" + loadSize + "===" + loadCompleteSize); + if (loadSize == loadCompleteSize) { + isLoadC = true; + if (completionListener != null) { + completionListener.onCompletion(); + } + } + } + } + + + /** + * 加载指定资源 + * + * @param name + * @param path + */ + public void loadR(String name, String path) { + if (checkSoundPool()) { + if (!idCache.containsKey(name)) { + idCache.put(name, mSoundPool.load(path, 1)); + } + } + } + + private int loadSize = 0; + + /** + * 加载指定路径列表的资源 + * + * @param map + */ + public void loadR(Map map) { + loadSize = map.size(); + Set> entries = map.entrySet(); + for (Map.Entry entry : entries) { + String key = entry.getKey(); + if (checkSoundPool()) { + if (!idCache.containsKey(key)) { + idCache.put(key, mSoundPool.load(entry.getValue(), 1)); + } + } + } + } + + /** + * 加载指定AssetFileDescriptor的资源 + * + * @param name + * @param afd + */ + public void loadRF(String name, AssetFileDescriptor afd) { + if (checkSoundPool()) { + if (!idCache.containsKey(name)) { + idCache.put(name, mSoundPool.load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(), 1)); + } + } + } + + /** + * 加载指定AssetFileDescriptor列表的资源 + * + * @param map + */ + public void loadRF(Map map) { + Set> entries = map.entrySet(); + for (Map.Entry entry : entries) { + String key = entry.getKey(); + if (checkSoundPool()) { + if (!idCache.containsKey(key)) { + idCache.put(key, mSoundPool.load(entry.getValue().getFileDescriptor(), entry.getValue().getStartOffset(), entry.getValue().getLength(), 1)); + } + } + } + } + + /** + * 加载指定列表资源 + * + * @param context + * @param map + */ + public void loadR(Context context, Map map) { + loadSize = map.size(); + Set> entries = map.entrySet(); + for (Map.Entry entry : entries) { + String key = entry.getKey(); + if (checkSoundPool()) { + + if (!idCache.containsKey(key)) { + idCache.put(key, mSoundPool.load(context, entry.getValue(), 1)); + } + } + } + } + + /** + * 加载单个音频 + * + * @param context + * @param name + * @param res + */ + public void loadR(Context context, String name, int res) { + if (checkSoundPool()) { + if (!idCache.containsKey(name)) { + idCache.put(name, mSoundPool.load(context, res, 1)); + } + } + } + + /** + * 播放指定音频,并返用于停止、暂停、恢复的StreamId + * + * @param name + * @param times + * @return + */ + public int play(String name, int times) { + L.e(String.format("play %s times=%s", name, times)); + return this.play(name, 1, 1, 1, times, 1); + } + + /** + * 播放指定音频,并指定播放次数和频率 + * + * @param name + * @param times + * @param rate + * @return + */ + public int play(String name, int times, int rate) { + return this.play(name, 1, 1, 1, times, rate); + } + + /** + * 播放指定音频,并指定优先级和播放频率 + * + * @param name + * @param property + * @param times + * @param rate + * @return + */ + public int play(String name, int property, int times, int rate) { + return this.play(name, 1, 1, property, times, rate); + } + + /** + * 播放指定音频,并指定左右声道、优先级、播放次数、播放频率 + * + * @param name + * @param leftVolume + * @param rightVolume + * @param property + * @param times + * @param rate + * @return + */ + public int play(String name, float leftVolume, float rightVolume, int property, int times, int rate) { + int streamId = -1; + if (checkSoundPool()) { + L.d(TAG, "play: " + name); + if (idCache.containsKey(name) && isLoadC) { + L.d(TAG, "name:" + idCache.get(name)); + streamId = mSoundPool.play(idCache.get(name), leftVolume, rightVolume, property, times, rate); + L.d(TAG, "streadmId:" + streamId); + sidCache.add(streamId); + } + } + return streamId; + } + + /** + * 播放指定列表的音频,并返回并返用于停止、暂停、恢复的StreamId列表 + * + * @param names + * @param times + * @return + */ + public List play(List names, int times) { + + return this.play(names, 1, 1, 1, times, 1); + } + + /** + * 播放指定列表的音频,并返回并返用于停止、暂停、恢复的StreamId列表,指定次数和频率 + * + * @param names + * @param times + * @param rate + * @return + */ + public List play(List names, int times, int rate) { + + return this.play(names, 1, 1, 1, times, rate); + } + + /** + * 播放指定列表的音频,并返回并返用于停止、暂停、恢复的StreamId列表,指定所有参数 + * + * @param names + * @param leftVolume + * @param rightVolume + * @param property + * @param times + * @param rate + * @return + */ + public List play(List names, int leftVolume, int rightVolume, int property, int times, int rate) { + List streamIds = new ArrayList<>(); + if (checkSoundPool()) { + for (String name : names) { + if (idCache.containsKey(name) && isLoadC) { + int a = mSoundPool.play(idCache.get(name), leftVolume, rightVolume, property, times, rate); + streamIds.add(a); + sidCache.add(a); + } + } + } + return streamIds; + } + + /** + * 停止指定id音频 + */ + public void stop(int r) { + if (checkSoundPool()) { + mSoundPool.stop(r); + } + } + + /** + * 停止指定列表音频 + */ + public void stopAll() { + if (checkSoundPool()) { + for (int r : sidCache) { + mSoundPool.stop(r); + } + } + } + + /** + * 暂停指定音效 + * + * @param r + */ + public void pause(int r) { + if (checkSoundPool()) { + mSoundPool.pause(r); + } + } + + /** + * 暂停指定列表音频 + * + * @param list + */ + public void pause(List list) { + if (checkSoundPool()) { + for (int r : list) { + mSoundPool.pause(r); + } + } + } + + /** + * 暂停所有音效 + */ + public void pauseAll() { + mSoundPool.autoPause(); + } + + /** + * 恢复指定音频播放 + * + * @param r + */ + public void resume(int r) { + if (checkSoundPool()) { + mSoundPool.resume(r); + } + } + + /** + * 恢复指定列表的音频 + * + * @param list + */ + public void resume(List list) { + if (checkSoundPool()) { + for (int r : list) { + mSoundPool.resume(r); + } + } + } + + /** + * 恢复所有暂停的音频 + */ + public void resumeAll() { + if (checkSoundPool()) { + mSoundPool.autoResume(); + } + } + + /** + * 卸载指定音频 + * + * @param name + */ + public void unLoad(String name) { + if (checkSoundPool()) { + if (idCache.containsKey(name)) { + mSoundPool.unload(idCache.get(name)); + idCache.remove(name); + } + } + } + + /** + * 卸载指定列表的音频 + * + * @param names + */ + public void unLoad(List names) { + if (checkSoundPool()) { + for (String name : names) { + if (idCache.containsKey(name)) { + mSoundPool.unload(idCache.get(name)); + idCache.remove(name); + } + } + } + } + + + /** + * 释放所有资源,如果想继续播放,需要重新加载资源 + */ + public void release() { + if (checkSoundPool()) { + mSound = null; + mSoundPool.release(); + idCache.clear(); + } + } + + private boolean checkSoundPool() { + if (mSoundPool != null) { + return true; + } + return false; + } + + public interface LoadCompletion { + void onCompletion(); + } +} + diff --git a/app/src/main/res/layout/activity_login_face.xml b/app/src/main/res/layout/activity_login_face.xml index b921499..81967a0 100644 --- a/app/src/main/res/layout/activity_login_face.xml +++ b/app/src/main/res/layout/activity_login_face.xml @@ -64,6 +64,16 @@ android:textSize="36sp" android:textStyle="bold" /> + + diff --git a/app/src/main/res/raw/success.wav b/app/src/main/res/raw/success.wav new file mode 100644 index 0000000000000000000000000000000000000000..d89f5c3f6107898f5ce757f63afa35e5942c571c GIT binary patch literal 76044 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

aJgR^#IwSIMKwQ6nPc8x0OK7D6KpRqS|xN?$! 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

#nCa4CjdPe?-6YN|640ZV&kd#azA}@6 zr_X*t_=TLb5+!+~O~Umn0DxDa!h5SCZi*}@fATvVOsrdi$ZoYOP(zr4vzM* z37fn3xZ8qQ)*f{lI0qSe%fX?R_wmMNs>-@bEDx`2{4VjGocG8NOYTLP(oa+_9z{!Q zqh&Lu;e2YN7Lx)`7oG!k<@+v&w*}#VhK?1ZAVJm@)gN2=tT>UK)b_mY z`O({Rio)ybmusamVJuG&)JGp9*Ig5EZ%!P=0q4S^)80MY+53?5``Y*O-qpOrTtnV1 z+8F3>gqsOc9UOWY|%sj+M>*6pY_M|$wEN1rR zOv3bYv9}9v>k`|aDZXZk?7FZXksGoYWCmQR-L-epe(W-v9u*$!Ygcz`J|0ykZl!#n zct2;u`kquJ`q1>rl(ykf%8~6v09mJUghx%H$!Ig^giq>i^GH3Ro_dd(2=!s8ni0vZ zi0Ha7AGvuo{YFQ8?z5~!?Q?0*rpM)7bzI_K*o){0u>>{I3w>&LmA&3-HftWmLaRl0 zrgoaP_tmg?`+6XG7QisMp+M-FIm5ZNMioQ2}Iv#z+HEM~o4zL@GE| z*HJKT^x{aN6*GC-qgmM;;Z5^uT@=fTq=@`3AaNf9FjptONm1lVwWAU zjlBn3+PuAH&F07WN9qryTTNTh>e}tSPqOZ=K43kneUfh-bC}$8Z!{>_rBKR|b;ycC z2Ho501*8z!Kr`r_fulTgI9t?kK^_?sRUOk6+kV4vV=E^9YTlLPONZxE&&Gv`gLMHr z)EzR_vt!>n5QZ;AdD~Mvmfcuw``6f#pEW4n26Bzju}==13Q0TbIZy6VW@-+t)Ip zqGb!xq4N#G1VLAbj6F_AkP&x*(_)P>6&$J_MDF+8nff$IGpL#Qq>!IyIgSPc<(VZRm1vjbb{xt56 z{x17I`5^BhZseM~kE`v)E|Ev$%?BKM3RO`Nr~}$$Z~~$O$Jw=0vwJ>WH?p z&FALDZRd+63Q5NKIx+LyhOkyJ9;W1Vaxz)7voKb9%mnISZC~wkiRMbtbyD!v5U@1u1? zmOfv{xi8R8+@oukwW|9y4~h>u9`cM!roN*-YpI>-f?p_Joo^Byr=>CbSo7?1PC7S> z=L(q(Q-o{669xN%=!k&`OGH(~1n2~eg&9NgpuN!`dZ3xHjP+AeNU?|M8nh)J^US+O z>~QHo`=C!}zCUq)`hLEy;{mSUF~mNac${dqSq4uE9m#GR;Fvv>dMu5x9^eR!@4!gPFXc#&X5kQk8~p@;~LfcmHK(y+b|^O;EQMo?j(gUO~lPz(`!Q*fn|Wn&-b zn42D(4@D1$4$}1H4@^4FgVhI1dYK{Zu*;}2RUav>k@hH;3oxHiL_#g4Z8G>QCfg9y z8O%R3z#9pv4J{3$^Aq@4d^vwU3=7*2spqlJpx`>rAEQDGT$Y#h<c$U2bh=^K1n})pcRA6V2 zFu0Dpb!MB_6p|de8H$JU!Ze}jq5UC!ydoGGROhjgK!UkQuL2Y3PM^%XgeSQ)_Mwyd z+iYN=dA`# zJ(r#YIeR^Ah?Y(}#Og7UT2DO$FZM;q{MSOANE%dwNufoNcZ$dWRA>?$=6auig3%_25%tuLeW0{3r+Vud;hJ}QC-6SYzHpzdx6D%LWA zEqDk^wgQV?3X1D%P+L|7W0d>YJ}bEo2>KE^O-{kXUze~BPW1+oAo);-mIIYb?SSxZ zfU-FqYI2gHvaBB1_9IX|)>@4-mO9#qew5bQw`N;DNteM*HyPdz0?-e z1kD0>dkB#5Zm4`~19$mWcy5RPyJ6lCeCB7LufdZ0(3YRmPKR1GA@ny2eCgvr3ta(7 zYtqw60q^3WIxiX+_)@6e5 10*1000) { + failCount = 0; + startTime = System.currentTimeMillis(); + } failCount++; - Log.d(TAG, "collectFace,searchFace查询失败"+failCount+"次"); + float similar; + if (compareResult != null) { + similar = compareResult.getSimilar(); + } else { + similar = 0f; + } + new Handler(Looper.getMainLooper()).post(()-> { + try { + Toast.makeText(App.getContext(),"识别失败"+failCount+"次,similar="+similar, Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + Log.d(TAG, "collectFace,searchFace查询失败"+failCount+"次,similar="+similar); if (failCount >= 2) { recognizeCallback.onRecognized(null, LivenessInfo.UNKNOWN, false); return; @@ -667,6 +691,7 @@ public class FaceHelper implements FaceListener { } compareResult.setTrackId(trackId); boolean pass = compareResult.getSimilar() > recognizeConfiguration.getSimilarThreshold(); + compareResult.setSimilarPass(pass); Log.d(TAG, "collectFace,searchFace: pass="+pass+",similar="+compareResult.getSimilar()+",threshold="+recognizeConfiguration.getSimilarThreshold()); recognizeCallback.onRecognized(compareResult, getRecognizeInfo(recognizeInfoMap, trackId).getLiveness(), pass); if (pass) { diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/face/model/CompareResult.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/face/model/CompareResult.java index 2d33f8b..f78d7c2 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/face/model/CompareResult.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/face/model/CompareResult.java @@ -10,6 +10,16 @@ public class CompareResult { private int compareCode; private long cost; + private boolean similarPass; + + public void setSimilarPass(boolean similarPass) { + this.similarPass = similarPass; + } + + public boolean isSimilarPass() { + return similarPass; + } + public CompareResult(FaceEntity faceEntity, float similar) { this.faceEntity = faceEntity; this.similar = similar; diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java index 5550152..dd01899 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java @@ -505,7 +505,7 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback { } } } else { - recognizeUserId.postValue(new CompareResult(null, -1f)); + recognizeUserId.postValue(compareResult); } }); }