최근에 원인을 알 수 없는 버그 때문에 고생을 했는데, 그 원인이 네트워크 연결 때문이었다.
그래서 이 버그를 고치기 위해서, 네트워크 연결이 없는 상태에서는 앱을 사용할 수 없도록 수정했는데,
오늘은 이때 사용한 네트워크 연결 상태 확인 방법에 대해 포스팅하려고 한다.
우선 네트워크 연결 상태를 읽기 위해서는,
다음과 같은 2개의 권한을 AndroidManifest.xml
에 추가해야 한다.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
아래의 내용은 안드로이드 공식 문서를 참고해서 작성한 내용입니다.
- Android 기기의
ConnectivityManager
객체를 가져온다.ConnectivityManager
객체를 사용하여 앱의 기본 네트워크 정보를 가지고 있는Network
객체를 가져온다.- 1과 2에서 얻은 2개의 객체를 사용하여
NetworkCapabilities
객체를 가져온다.NetworkCapabilities
객체를 사용한다.
이를 코드로 나타낸 것은 아래와 같다.
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
class NetworkManager {
companion object {
fun checkNetworkState(context: Context): Boolean {
val connectivityManager: ConnectivityManager =
context.getSystemService(ConnectivityManager::class.java)
val network: Network = connectivityManager.activeNetwork ?: return false
val actNetwork: NetworkCapabilities =
connectivityManager.getNetworkCapabilities(network) ?: return false
return when {
actNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
actNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
else -> false
}
}
}
}
NetworkCapabilities.hasTransport()
는 Cellular, Wifi, VPN, Bluetooth 등의 연결 상태를 확인할 수 있는 함수이다.
위의 코드에서는 NetworkCapabilities.TRANSPORT_CELLULAR
와 NetworkCapabilities.TRANSPORT_WIFI
를 사용하여 Cellular와 Wifi 연결 상태를 확인하고 있다.
이외의 Bluetooth, VPN 등의 연결 상태를 확인하고 싶다면 안드로이드 공식 문서를 참고하면 될 것 같다.
이 상태에서 네트워크 상태를 확인하고 싶은 부분에 아래의 코드를 추가하면 된다.
// 네트워크가 연결되어 있지 않은 경우
if (!NetworkManager.checkNetworkState(this)) {
}
// 네트워크가 연결되어 있는 경우
else {
}
이번 포스팅에서 작성한 내용은 순간적인 네트워크 상태를 읽어오는 방법이다.
따라서 네트워크 연결이 시작되거나, 끝나는 이벤트를 받아오는 작업을 하기에는 어려움이 있다.
다음 포스팅에서는 네트워크 연결 및 종료 이벤트에 대하여 콜백 함수를 호출하는 방법에 대하여 포스팅할 예정이다.