feat(asr): 添加网络连接检测和无网络提示功能

- 在ASR助手中添加网络状态监测功能
- 当网络不可用时显示提醒对话框
- 实现实时网络连接状态轮询检查
- 添加网络恢复后的自动关闭对话框逻辑
- 集成系统连接管理器进行网络能力检测
- 在语音唤醒触发时优先检查网络连接状态
这个提交包含在:
徐勤民 2026-04-18 17:57:43 +08:00
父节点 c770aad6ec
当前提交 1e08f429e6

查看文件

@ -2,8 +2,11 @@ package com.nova.brain.glass.helper
import android.R.attr.action import android.R.attr.action
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
@ -52,6 +55,17 @@ object AsrHelper : OfflineCmdListener {
private val mainHandler = Handler(Looper.getMainLooper()) private val mainHandler = Handler(Looper.getMainLooper())
private var listeningDialog: AlertDialog? = null 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 = "" 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) { private fun setupAsrCallbacks(asrClient: AsrClient) {
asrClient.setListener(object : AsrClient.Listener { asrClient.setListener(object : AsrClient.Listener {
override fun onOpen() { override fun onOpen() {
@ -266,6 +317,11 @@ object AsrHelper : OfflineCmdListener {
override fun onOfflineCmd(cmd: String) { override fun onOfflineCmd(cmd: String) {
if (cmd == WAKE_WORD || cmd == WAKE_WORD1 || cmd == "C大脑") { if (cmd == WAKE_WORD || cmd == WAKE_WORD1 || cmd == "C大脑") {
Log.d(TAG, "Wake word triggered") Log.d(TAG, "Wake word triggered")
if (!isNetworkAvailable()) {
dismissListeningDialog()
startNoNetworkMonitor()
return
}
showListeningDialog() showListeningDialog()
if (isTtsConnected) { if (isTtsConnected) {
tts?.speak(WAKE_RESPONSE) tts?.speak(WAKE_RESPONSE)
@ -278,6 +334,8 @@ object AsrHelper : OfflineCmdListener {
fun close() { fun close() {
OfflineCmdServiceHelper.removeOnLineListener(this) OfflineCmdServiceHelper.removeOnLineListener(this)
mainHandler.removeCallbacks(networkCheckRunnable)
dismissNoNetworkDialog()
if (isMicRunning) { if (isMicRunning) {
runCatching { asr?.stopAsrWithMic() } runCatching { asr?.stopAsrWithMic() }
isMicRunning = false isMicRunning = false