新增网络工具,修改bug

This commit is contained in:
weber
2025-08-27 16:37:53 +08:00
parent 52e571da01
commit 2a7d310be5
14 changed files with 382 additions and 226 deletions

View File

@@ -0,0 +1,71 @@
package com.aiosman.ravenow.utils
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.os.Build
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.distinctUntilChanged
object NetworkUtils {
/**
* 检查当前网络是否可用
*/
fun isNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val network = connectivityManager.activeNetwork ?: return false
val activeNetwork = connectivityManager.getNetworkCapabilities(network) ?: return false
activeNetwork.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
activeNetwork.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
} else {
@Suppress("DEPRECATION")
val networkInfo = connectivityManager.activeNetworkInfo
@Suppress("DEPRECATION")
networkInfo?.isConnected == true
}
}
/**
* 获取网络状态变化的Flow
*/
fun getNetworkStateFlow(context: Context): Flow<Boolean> = callbackFlow {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(true)
}
override fun onLost(network: Network) {
trySend(false)
}
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
val hasInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
trySend(hasInternet)
}
}
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
// 发送初始状态
trySend(isNetworkAvailable(context))
awaitClose {
connectivityManager.unregisterNetworkCallback(networkCallback)
}
}.distinctUntilChanged()
}