如何处理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
相关产品推荐
相关产品推荐

