From 1e08f429e60223251241a81d19efae3304077644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Sat, 18 Apr 2026 17:57:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(asr):=20=E6=B7=BB=E5=8A=A0=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E8=BF=9E=E6=8E=A5=E6=A3=80=E6=B5=8B=E5=92=8C=E6=97=A0?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=8F=90=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在ASR助手中添加网络状态监测功能 - 当网络不可用时显示提醒对话框 - 实现实时网络连接状态轮询检查 - 添加网络恢复后的自动关闭对话框逻辑 - 集成系统连接管理器进行网络能力检测 - 在语音唤醒触发时优先检查网络连接状态 --- .../com/nova/brain/glass/helper/AsrHelper.kt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt b/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt index adf288b..b19b5b4 100644 --- a/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt +++ b/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt @@ -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