From 2d8770040f749f47a41785fcaf0043beb4a2bc92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Wed, 15 Apr 2026 13:48:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor(voice):=20=E9=87=8D=E6=9E=84=E7=A6=BB?= =?UTF-8?q?=E7=BA=BF=E8=AF=AD=E9=9F=B3=E5=91=BD=E4=BB=A4=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 提取通用关键词到 COMMON_CMDS 常量中 - 添加 registerBeans 和 removeBeans 辅助方法统一管理语音命令 - 在初始化时注册通用关键词,避免在每个页面重复注册 - 为每个页面添加对应的移除方法,在页面离开时清理独有关键词 - 将页面特定关键词注册从 initData 移至 onResume,注销从 onDestroy 移至 onPause - 删除不再使用的 addListenerFo 方法中的重复代码 - 统一管理页面生命周期中的语音命令注册和注销逻辑 --- .../glass/helper/OfflineCmdServiceHelper.kt | 347 ++++++++---------- .../com/nova/brain/glass/ui/FoActivity.kt | 7 +- .../nova/brain/glass/ui/InspectionActivity.kt | 5 +- .../com/nova/brain/glass/ui/ReviewActivity.kt | 15 +- .../nova/brain/glass/ui/SprayingActivity.kt | 2 +- .../brain/glass/ui/SprayingFinishActivity.kt | 16 +- .../glass/ui/SprayingManualResultActivity.kt | 10 +- .../brain/glass/ui/SprayingOCRActivity.kt | 2 +- .../brain/glass/ui/SprayingResultActivity.kt | 2 +- .../nova/brain/glass/ui/TaskListActivity.kt | 2 +- 10 files changed, 203 insertions(+), 205 deletions(-) diff --git a/app/src/main/java/com/nova/brain/glass/helper/OfflineCmdServiceHelper.kt b/app/src/main/java/com/nova/brain/glass/helper/OfflineCmdServiceHelper.kt index d8347b5..274bdf7 100644 --- a/app/src/main/java/com/nova/brain/glass/helper/OfflineCmdServiceHelper.kt +++ b/app/src/main/java/com/nova/brain/glass/helper/OfflineCmdServiceHelper.kt @@ -81,43 +81,48 @@ object OfflineCmdServiceHelper { // } + // 所有页面通用关键词 + private val COMMON_CMDS = listOf( + OfflineCmdBean("退出", "tui chu"), + OfflineCmdBean("返回", "fan hui") + ) + private var service: IOfflineCmdService? = null + + private fun registerBeans(beans: List) { + + for (bean in beans) { + LogHelper.d("------>>>>>>>>>--------${service !== null}") + service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { + override fun onVoiceTriggered() { + LogHelper.d("onOfflineCmd: ${bean.text}") + for (l in listenerList) { + l.onOfflineCmd(bean.text) + } + } + })) + } + } + + private val noopCallback = object : IVoiceCallback.Stub() { + override fun onVoiceTriggered() {} + } + + private fun removeBeans(beans: List) { + for (bean in beans) { + service?.remove(VoiceAction(bean.text, bean.pinyin, noopCallback)) + } + } + + private fun addCommonCmds() { + registerBeans(COMMON_CMDS) + } + @Synchronized fun init(){ service = GlassSdk.getGlassOfflineCmdService() -// LogHelper.d("init") -// if (initialized || initializing) { -// return -// } -// LogHelper.d("init111") -// initializing = true -// LogHelper.d("init222") -// initExecutor.execute { -// try { -// val service = GlassSdk.getGlassOfflineCmdService() -// if (service == null){ -// LogHelper.e("OfflineCmdServiceHelper","service is null") -// return@execute -// } -// LogHelper.d("init444") -// LogHelper.e("OfflineCmdServiceHelper","service 存在") -// for (bean in list) { -// service.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { -// override fun onVoiceTriggered() { -// LogHelper.d("onOfflineCmd: ${bean.text}") -// for (l in listenerList) { -// l.onOfflineCmd(bean.text) -// } -// } -// })) -// } -// LogHelper.d("init555") -// initialized = true -// } finally { -// LogHelper.d("init333") -// initializing = false -// } -// } + // 通用关键词在 init 时注册一次,页面切换不会移除它们 + addCommonCmds() } fun addOnLineListener(listener: OfflineCmdListener){ this.listenerList.add(listener) @@ -127,175 +132,149 @@ object OfflineCmdServiceHelper { } fun addListenerList(){ - for (bean in mutableListOf().apply { - // 任务列表 - add(OfflineCmdBean("下一页", "xia yi ye")) - add(OfflineCmdBean("上一页", "shang yi ye")) - - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - - add(OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu")) - add(OfflineCmdBean("第一个", "di yi ge")) - - add(OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu")) - add(OfflineCmdBean("第二个", "di er ge")) - - add(OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu")) - add(OfflineCmdBean("第三个", "di san ge")) - - add(OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu")) - add(OfflineCmdBean("第四个", "di si ge")) - - add(OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu")) - add(OfflineCmdBean("第五个", "di wu ge")) - - add(OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu")) - add(OfflineCmdBean("第六个", "di liu ge")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 任务列表独有关键词(通用关键词已在 init 注册,无需重复) + registerBeans(listOf( + OfflineCmdBean("下一页", "xia yi ye"), + OfflineCmdBean("上一页", "shang yi ye"), + OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"), + OfflineCmdBean("第一个", "di yi ge"), + OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"), + OfflineCmdBean("第二个", "di er ge"), + OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"), + OfflineCmdBean("第三个", "di san ge"), + OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"), + OfflineCmdBean("第四个", "di si ge"), + OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"), + OfflineCmdBean("第五个", "di wu ge"), + OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"), + OfflineCmdBean("第六个", "di liu ge") + )) } + fun removeAll(){ service?.removeAll() } - fun addListenerFo(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } - } + // addListenerFo: 无独有关键词,通用关键词已在 init 注册 + fun addListenerFo(){ } + fun addListenerInspection(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - add(OfflineCmdBean("驳回", "bo hui")) - add(OfflineCmdBean("通过", "tong guo")) - add(OfflineCmdBean("同意", "bo hui")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 巡检页独有关键词 + registerBeans(listOf( + OfflineCmdBean("驳回", "bo hui"), + OfflineCmdBean("通过", "tong guo"), + OfflineCmdBean("同意", "tong yi") + )) } + fun addListenerSpraying(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - add(OfflineCmdBean("开始任务", "kai shi ren wu")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 喷涂页独有关键词 + registerBeans(listOf( + OfflineCmdBean("开始任务", "kai shi ren wu") + )) } + fun addListenerSprayingFinish(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - add(OfflineCmdBean("补充照片", "bu chong zhao pian")) - add(OfflineCmdBean("确认提交", "que ren ti jiao")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 喷涂完成页独有关键词 + registerBeans(listOf( + OfflineCmdBean("补充照片", "bu chong zhao pian"), + OfflineCmdBean("确认提交", "que ren ti jiao") + )) } + fun addListenerSprayingManualResulth(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - add(OfflineCmdBean("合格", "he ge")) - add(OfflineCmdBean("不合格", "bu he ge")) - add(OfflineCmdBean("取消", "qu xiao")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 喷涂人工更正页独有关键词 + registerBeans(listOf( + OfflineCmdBean("合格", "he ge"), + OfflineCmdBean("不合格", "bu he ge"), + OfflineCmdBean("取消", "qu xiao") + )) } + fun addListenerSprayingOCR(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - add(OfflineCmdBean("重拍", "chong pai")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 喷涂OCR页独有关键词 + registerBeans(listOf( + OfflineCmdBean("重拍", "chong pai") + )) } + fun addListenerSprayingResult(){ - for (bean in mutableListOf().apply { - add(OfflineCmdBean("退出", "tui chu")) - add(OfflineCmdBean("返回", "fan hui")) - add(OfflineCmdBean("重拍", "chong pai")) - add(OfflineCmdBean("继续拍摄", "ji xu pai she")) - add(OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo")) - add(OfflineCmdBean("更正", "geng zheng")) - add(OfflineCmdBean("结束任务", "jie shu ren wu")) - }) { - LogHelper.d("------>>>>>>>>>--------${service!==null}") - service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() { - override fun onVoiceTriggered() { - LogHelper.d("onOfflineCmd: ${bean.text}") - for (l in listenerList) { - l.onOfflineCmd(bean.text) - } - } - })) - } + // 喷涂结果页独有关键词 + registerBeans(listOf( + OfflineCmdBean("重拍", "chong pai"), + OfflineCmdBean("继续拍摄", "ji xu pai she"), + OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"), + OfflineCmdBean("更正", "geng zheng"), + OfflineCmdBean("结束任务", "jie shu ren wu") + )) } + // ---- 各页面离开时移除独有关键词(退出/返回为公共关键词,不移除)---- + fun removeListenerList(){ + removeBeans(listOf( + OfflineCmdBean("下一页", "xia yi ye"), + OfflineCmdBean("上一页", "shang yi ye"), + OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"), + OfflineCmdBean("第一个", "di yi ge"), + OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"), + OfflineCmdBean("第二个", "di er ge"), + OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"), + OfflineCmdBean("第三个", "di san ge"), + OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"), + OfflineCmdBean("第四个", "di si ge"), + OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"), + OfflineCmdBean("第五个", "di wu ge"), + OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"), + OfflineCmdBean("第六个", "di liu ge") + )) + } + + // addListenerFo 无独有关键词,无需对应 remove 方法 + + fun removeListenerInspection(){ + removeBeans(listOf( + OfflineCmdBean("驳回", "bo hui"), + OfflineCmdBean("通过", "tong guo"), + OfflineCmdBean("同意", "tong yi") + )) + } + + fun removeListenerSpraying(){ + removeBeans(listOf( + OfflineCmdBean("开始任务", "kai shi ren wu") + )) + } + + fun removeListenerSprayingFinish(){ + removeBeans(listOf( + OfflineCmdBean("补充照片", "bu chong zhao pian"), + OfflineCmdBean("确认提交", "que ren ti jiao") + )) + } + + fun removeListenerSprayingManualResulth(){ + removeBeans(listOf( + OfflineCmdBean("合格", "he ge"), + OfflineCmdBean("不合格", "bu he ge"), + OfflineCmdBean("取消", "qu xiao") + )) + } + + fun removeListenerSprayingOCR(){ + removeBeans(listOf( + OfflineCmdBean("重拍", "chong pai") + )) + } + + fun removeListenerSprayingResult(){ + removeBeans(listOf( + OfflineCmdBean("重拍", "chong pai"), + OfflineCmdBean("继续拍摄", "ji xu pai she"), + OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"), + OfflineCmdBean("更正", "geng zheng"), + OfflineCmdBean("结束任务", "jie shu ren wu") + )) + } } diff --git a/app/src/main/java/com/nova/brain/glass/ui/FoActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/FoActivity.kt index 8f453b7..2234bef 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/FoActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/FoActivity.kt @@ -25,16 +25,17 @@ class FoActivity : BaseActivity() { } override fun initData() { super.initData() - OfflineCmdServiceHelper.addListenerFo() - OfflineCmdServiceHelper.addOnLineListener(listener) val html = "加粗

换行

h1

" binding.content.text = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY) } + override fun onResume() { + super.onResume() + OfflineCmdServiceHelper.addOnLineListener(listener) + } override fun onPause() { super.onPause() - OfflineCmdServiceHelper.removeAll() OfflineCmdServiceHelper.removeOnLineListener(listener) } } diff --git a/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt index aa26071..3f0eb0a 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt @@ -38,22 +38,23 @@ class InspectionActivity : BaseListFormLayoutNormalActivity(R.layout.item_item) { override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { diff --git a/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt index b4082a9..6812487 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt @@ -37,15 +37,24 @@ class ReviewActivity : BaseListFormLayoutNormalActivity(R.layout.item_item) { diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt index 1530e28..96abea1 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt @@ -111,9 +111,9 @@ class SprayingActivity : override fun onPause() { super.onPause() + OfflineCmdServiceHelper.removeListenerSpraying() OfflineCmdServiceHelper.removeOnLineListener(listener) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) - OfflineCmdServiceHelper.removeAll() } private var isPhoto = false diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingFinishActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingFinishActivity.kt index 5fb359f..0fb8747 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingFinishActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingFinishActivity.kt @@ -40,18 +40,26 @@ class SprayingFinishActivity : override fun initData() { super.initData() - OfflineCmdServiceHelper.addOnLineListener(listener) - OfflineCmdServiceHelper.addListenerSprayingFinish() renderPhotos() } + override fun onResume() { + super.onResume() + OfflineCmdServiceHelper.addListenerSprayingFinish() + OfflineCmdServiceHelper.addOnLineListener(listener) + } + + override fun onPause() { + super.onPause() + OfflineCmdServiceHelper.removeListenerSprayingFinish() + OfflineCmdServiceHelper.removeOnLineListener(listener) + } + override fun onDestroy() { super.onDestroy() binding.photo1.setImageDrawable(null) binding.photo2.setImageDrawable(null) binding.photo3.setImageDrawable(null) - OfflineCmdServiceHelper.removeOnLineListener(listener) - OfflineCmdServiceHelper.removeAll() } private fun renderPhotos() { diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingManualResultActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingManualResultActivity.kt index 43b13ae..c5a5797 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingManualResultActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingManualResultActivity.kt @@ -33,15 +33,15 @@ class SprayingManualResultActivity : } } - override fun initData() { - super.initData() + override fun onResume() { + super.onResume() OfflineCmdServiceHelper.addListenerSprayingManualResulth() OfflineCmdServiceHelper.addOnLineListener(listener) } - override fun onDestroy() { - super.onDestroy() - OfflineCmdServiceHelper.removeAll() + override fun onPause() { + super.onPause() + OfflineCmdServiceHelper.removeListenerSprayingManualResulth() OfflineCmdServiceHelper.removeOnLineListener(listener) } diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt index 275d676..e94f7b1 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt @@ -116,9 +116,9 @@ class SprayingOCRActivity : override fun onPause() { super.onPause() resultCountdown?.cancel() + OfflineCmdServiceHelper.removeListenerSprayingOCR() OfflineCmdServiceHelper.removeOnLineListener(listener) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) - OfflineCmdServiceHelper.removeAll() } override fun onDestroy() { diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt index bc284a1..f72e2db 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt @@ -192,8 +192,8 @@ class SprayingResultActivity : } override fun onPause() { super.onPause() + OfflineCmdServiceHelper.removeListenerSprayingResult() OfflineCmdServiceHelper.removeOnLineListener(listener) - OfflineCmdServiceHelper.removeAll() GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) } override fun onDestroy() { diff --git a/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt index 0f78b03..f28acbe 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt @@ -179,7 +179,7 @@ class TaskListActivity : override fun onPause() { super.onPause() - OfflineCmdServiceHelper.removeAll() + OfflineCmdServiceHelper.removeListenerList() OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener) }