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