feat(asr): 添加网络连接检测和无网络提示功能
- 在ASR助手中添加网络状态监测功能 - 当网络不可用时显示提醒对话框 - 实现实时网络连接状态轮询检查 - 添加网络恢复后的自动关闭对话框逻辑 - 集成系统连接管理器进行网络能力检测 - 在语音唤醒触发时优先检查网络连接状态
这个提交包含在:
父节点
c770aad6ec
当前提交
1e08f429e6
@ -2,8 +2,11 @@ package com.nova.brain.glass.helper
|
||||
|
||||
import android.R.attr.action
|
||||
import android.app.AlertDialog
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.NetworkCapabilities
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.Log
|
||||
@ -52,6 +55,17 @@ object AsrHelper : OfflineCmdListener {
|
||||
|
||||
private val mainHandler = Handler(Looper.getMainLooper())
|
||||
private var listeningDialog: AlertDialog? = null
|
||||
private var noNetworkDialog: AlertDialog? = null
|
||||
private val networkCheckRunnable = object : Runnable {
|
||||
override fun run() {
|
||||
if (isNetworkAvailable()) {
|
||||
dismissNoNetworkDialog()
|
||||
return
|
||||
}
|
||||
showNoNetworkDialog()
|
||||
mainHandler.postDelayed(this, 1000L)
|
||||
}
|
||||
}
|
||||
|
||||
// 拼接每次识别会话中的中间结果
|
||||
private var currentPartial = ""
|
||||
@ -169,6 +183,43 @@ object AsrHelper : OfflineCmdListener {
|
||||
}
|
||||
}
|
||||
|
||||
private fun showNoNetworkDialog() {
|
||||
mainHandler.post {
|
||||
if (noNetworkDialog?.isShowing == true) return@post
|
||||
val activity = runCatching { AppManager.getInstance().getActivity() }.getOrNull()
|
||||
?: return@post
|
||||
if (activity.isFinishing || activity.isDestroyed) return@post
|
||||
noNetworkDialog = AlertDialog.Builder(activity)
|
||||
.setTitle("网络异常")
|
||||
.setMessage("当前无网络,请检查网络连接")
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
.also { it.show() }
|
||||
}
|
||||
}
|
||||
|
||||
private fun dismissNoNetworkDialog() {
|
||||
mainHandler.post {
|
||||
noNetworkDialog?.dismiss()
|
||||
noNetworkDialog = null
|
||||
}
|
||||
}
|
||||
|
||||
private fun startNoNetworkMonitor() {
|
||||
mainHandler.removeCallbacks(networkCheckRunnable)
|
||||
networkCheckRunnable.run()
|
||||
}
|
||||
|
||||
private fun isNetworkAvailable(): Boolean {
|
||||
val activity = runCatching { AppManager.getInstance().getActivity() }.getOrNull()
|
||||
val context: Context = activity ?: return false
|
||||
val connectivityManager =
|
||||
context.getSystemService(ConnectivityManager::class.java) ?: return false
|
||||
val network = connectivityManager.activeNetwork ?: return false
|
||||
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
|
||||
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
}
|
||||
|
||||
private fun setupAsrCallbacks(asrClient: AsrClient) {
|
||||
asrClient.setListener(object : AsrClient.Listener {
|
||||
override fun onOpen() {
|
||||
@ -266,6 +317,11 @@ object AsrHelper : OfflineCmdListener {
|
||||
override fun onOfflineCmd(cmd: String) {
|
||||
if (cmd == WAKE_WORD || cmd == WAKE_WORD1 || cmd == "C大脑") {
|
||||
Log.d(TAG, "Wake word triggered")
|
||||
if (!isNetworkAvailable()) {
|
||||
dismissListeningDialog()
|
||||
startNoNetworkMonitor()
|
||||
return
|
||||
}
|
||||
showListeningDialog()
|
||||
if (isTtsConnected) {
|
||||
tts?.speak(WAKE_RESPONSE)
|
||||
@ -278,6 +334,8 @@ object AsrHelper : OfflineCmdListener {
|
||||
|
||||
fun close() {
|
||||
OfflineCmdServiceHelper.removeOnLineListener(this)
|
||||
mainHandler.removeCallbacks(networkCheckRunnable)
|
||||
dismissNoNetworkDialog()
|
||||
if (isMicRunning) {
|
||||
runCatching { asr?.stopAsrWithMic() }
|
||||
isMicRunning = false
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户