AndroidでNetworkへの接続を確認する
自分で作ったことなかったので、サクッとやったメモ
https://github.com/kkhouse/Playground/tree/main/AndroidProject/Network/connecticitySample
sealed class NetworkStatus {
object Unknown: NetworkStatus()
object Connected: NetworkStatus()
object Disconnected: NetworkStatus()
}
class NetworkConnectivityServiceImpl(
context: Context,
request: NetworkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build(),
): NetworkConnectivityService {
private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
override val networkStatus: Flow<NetworkStatus> = callbackFlow {
val connectivityCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(NetworkStatus.Connected)
}
override fun onUnavailable() {
trySend(NetworkStatus.Disconnected)
}
override fun onLost(network: Network) {
trySend(NetworkStatus.Disconnected)
}
}
connectivityManager.registerNetworkCallback(request, connectivityCallback)
awaitClose {
connectivityManager.unregisterNetworkCallback(connectivityCallback)
}
}
.distinctUntilChanged()
.flowOn(Dispatchers.IO)
}
-
ConnectivityManagerがCallbackだったので、callbackFlowでラップする。
-
Channel
にてtrySend
することで値の変更を送信する。
val networkStatus = NetworkConnectivityServiceImpl(context).networkStatus.stateIn(
initialValue = NetworkStatus.Unknown,
scope = viewModelScope,
started = WhileSubscribed(5000)
)
ViewModel
等で監視すればComposable側で使える。(上はベタガキですが、ContextはDIした方が良いです。)
機内モードにするとDisconnectedなので多分動いている。