You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理NetworkRequest.Builder弹窗中的取消按钮点击事件

问题:使用NetworkRequest连接WiFi AP时,取消系统提示框无回调触发

我通过NetworkRequest.Builder().setNetworkSpecifier()连接外设提供的WiFi AP,已成功实现连接,但在失败场景下存在问题:当未找到目标AP时,系统会弹出提示对话框,点击对话框的“取消”按钮后,没有任何回调方法被触发。

实现代码如下:

fun connectPeerWifiNetworkFlow(peerSpecifier: NetworkSpecifier) = callbackFlow {
    val request = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(peerSpecifier)
        .build()

    val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            trySend(network)
        }

        override fun onUnavailable() {
            super.onUnavailable()
            trySend(null)
        }
    }
    connectivityManager.requestNetwork(request, networkCallback)
    awaitClose {
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }
}

解决方案

1. 监听系统WiFi选择界面的返回结果

系统弹出的连接提示框是系统级Activity(如WifiPickerActivity),可以通过ActivityResultLauncher监听其返回状态,当用户点击取消时手动触发回调并清理资源:

// 在Activity/Fragment中注册Launcher
private val wifiPickerLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_CANCELED) {
        // 用户取消操作,通知Flow并取消网络请求
        connectivityManager.unregisterNetworkCallback(yourNetworkCallback)
        yourFlowScope.launch {
            connectPeerWifiNetworkFlow(peerSpecifier).tryEmit(null)
        }
    }
}

注意:需要妥善保存yourNetworkCallback和connectivityManager的引用,或者将Launcher逻辑与Flow生命周期绑定。

2. 完善NetworkCallback的失败回调方法

针对不同Android版本补充失败回调,覆盖更多场景:

  • Android 12(API 31+)新增onFailed()方法,专门处理网络请求失败情况
  • 重写onLost()处理已连接网络丢失的场景

修改后的NetworkCallback:

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
        trySend(network)
    }

    override fun onUnavailable() {
        super.onUnavailable()
        trySend(null)
    }

    override fun onFailed() {
        super.onFailed()
        trySend(null)
    }

    override fun onLost(network: Network) {
        super.onLost(network)
        trySend(null)
    }
}

3. 给网络请求设置超时(备选方案)

调用requestNetwork的带超时重载,当用户取消对话框后,超时触发时会调用onUnavailable:

// 设置10秒超时,可根据需求调整
connectivityManager.requestNetwork(request, networkCallback, 10000)

这种方式不够及时,但可以作为低版本适配的补充方案。

内容的提问来源于stack exchange,提问作者honeybee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:40:40