refactor(voice): 重构离线语音命令服务实现

- 提取通用关键词到 COMMON_CMDS 常量中
- 添加 registerBeans 和 removeBeans 辅助方法统一管理语音命令
- 在初始化时注册通用关键词,避免在每个页面重复注册
- 为每个页面添加对应的移除方法,在页面离开时清理独有关键词
- 将页面特定关键词注册从 initData 移至 onResume,注销从 onDestroy 移至 onPause
- 删除不再使用的 addListenerFo 方法中的重复代码
- 统一管理页面生命周期中的语音命令注册和注销逻辑
这个提交包含在:
徐勤民 2026-04-15 13:48:59 +08:00
父节点 5632119792
当前提交 2d8770040f
共有 10 个文件被更改,包括 203 次插入205 次删除

查看文件

@ -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<OfflineCmdBean>) {
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<OfflineCmdBean>) {
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<OfflineCmdBean>().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<OfflineCmdBean>().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<OfflineCmdBean>().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<OfflineCmdBean>().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<OfflineCmdBean>().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<OfflineCmdBean>().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<OfflineCmdBean>().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<OfflineCmdBean>().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")
))
}
}

查看文件

@ -25,16 +25,17 @@ class FoActivity : BaseActivity<ActivityFoBinding>() {
}
override fun initData() {
super.initData()
OfflineCmdServiceHelper.addListenerFo()
OfflineCmdServiceHelper.addOnLineListener(listener)
val html = "<b>加粗</b> <br><br>换行 <br><br><h1>h1</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)
}
}

查看文件

@ -38,22 +38,23 @@ class InspectionActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM
override fun initData() {
super.initData()
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
OfflineCmdServiceHelper.addListenerInspection()
}
override fun onResume() {
super.onResume()
OfflineCmdServiceHelper.addListenerInspection()
OfflineCmdServiceHelper.addOnLineListener(listener)
}
override fun onPause() {
super.onPause()
OfflineCmdServiceHelper.removeListenerInspection()
OfflineCmdServiceHelper.removeOnLineListener(listener)
}
override fun onDestroy() {
super.onDestroy()
OfflineCmdServiceHelper.removeAll()
window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) {
override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {

查看文件

@ -37,15 +37,24 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
}
override fun initData() {
super.initData()
OfflineCmdServiceHelper.addListenerInspection()
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
override fun onResume() {
super.onResume()
OfflineCmdServiceHelper.addListenerInspection()
OfflineCmdServiceHelper.addOnLineListener(listener)
}
override fun onPause() {
super.onPause()
OfflineCmdServiceHelper.removeListenerInspection()
OfflineCmdServiceHelper.removeOnLineListener(listener)
}
override fun onDestroy() {
super.onDestroy()
OfflineCmdServiceHelper.removeOnLineListener(listener)
OfflineCmdServiceHelper.removeAll()
window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) {

查看文件

@ -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

查看文件

@ -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() {

查看文件

@ -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)
}

查看文件

@ -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() {

查看文件

@ -192,8 +192,8 @@ class SprayingResultActivity :
}
override fun onPause() {
super.onPause()
OfflineCmdServiceHelper.removeListenerSprayingResult()
OfflineCmdServiceHelper.removeOnLineListener(listener)
OfflineCmdServiceHelper.removeAll()
GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
}
override fun onDestroy() {

查看文件

@ -179,7 +179,7 @@ class TaskListActivity :
override fun onPause() {
super.onPause()
OfflineCmdServiceHelper.removeAll()
OfflineCmdServiceHelper.removeListenerList()
OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener)
}