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