[Kotlin] Android 네트워크 연결 상태 확인
안드로이드로 작업을 하다 보면 네트워크 연결상태에 따라 분기 처리를 해줘야 할 때가 있다.
네트워크가 연결이 되었는지, 되었다면 어떤 경로인지(Wifi, Cellualar, VPN 등..)
이에 따라 네트워크 오프라인 일 때는 앱 이용을 못하게 한다거나, 특정 네트워크 상태에 따라 비즈니스도 변경될 수 있다.
구체적으로 사용하는 객체는 다음과 같다.
- ConnectivityManager객체를 이용해 시스템 연결상태를 앱에 알린다.
- Network 클래스는 기기가 현재 연결된 네트워크 중 하나를 나타낸다. Network 객체를 키로 사용하여 ConnectivityManager와 함께 네트워크 정보를 수집하거나 네트워크에서 소켓을 결합할 수 있다. 네트워크 연결이 끊어지면 Network 객체는 사용이 중지되고 나중에 기기가 동일한 어플라이언스에 다시 연결되더라도 새 Network 객체는 새 네트워크를 나타낸다.
- LinkProperties 객체에는 네트워크에 설치된 DNS 서버, 로컬 IP 주소, 네트워크 경로 목록 등의 네트워크 연결 정보가 포함된다.
- NetworkCapabilities 객체에는 전송(Wi-Fi, 셀룰러, 블루투스) 및 네트워크에서 사용할 수 있는 기능과 같은 네트워크 속성 정보가 포함된다. 예를 들어, 객체를 쿼리 하여 네트워크가 MMS를 전송할 수 있는지, 종속 포털을 지원하는지, 데이터 전송량 제한이 있는지 확인할 수 있다.
먼저 네트워크를 확인하기 위한 권한을 주어야한다.
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
네트워크 연결 상태를 나타내는 함수
fun checkNetworkStatus(): Boolean {
val isConnected: Boolean
val connectivityManager = mContext.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
var connectionType: String? = null
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val networkCapabilities = connectivityManager.activeNetwork ?: return false
val networkCaps =
connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
connectionType = when {
networkCaps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "Wifi"
networkCaps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "Cellular"
networkCaps.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> "Ethernet"
networkCaps.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> "VPN"
else -> null
}
} else {
connectivityManager.run {
connectivityManager.activeNetworkInfo?.run {
connectionType = when (type) {
ConnectivityManager.TYPE_WIFI -> "Wifi"
ConnectivityManager.TYPE_MOBILE -> "Mobile"
ConnectivityManager.TYPE_ETHERNET -> "Ethernet"
ConnectivityManager.TYPE_VPN -> "VPN"
else -> null
}
}
}
}
Log.i(TAG, "Network Connection is $connectionType")
isConnected = !ObjectUtils.isEmpty(connectionType)
return isConnected
}
API 23 이후부터 NetworkCapabilities를 이용한 네트워크 구분이 가능하기에 다음과 같이 마시멜로 기준으로 분기 처리를 하였다.
mContext는 Context 객체이다.
<참조>
https://developer.android.com/training/basics/network-ops/reading-network-state
'Andorid' 카테고리의 다른 글
[Kotlin] Android bitmap 최적화 (0) | 2022.08.31 |
---|---|
[Kotlin] Android OutOfMemoryError (0) | 2022.08.27 |
[Kotlin] Local Storage에 logcat파일 만들기 (0) | 2022.08.25 |
[Kotlin] Firebase 연동 & Realtime Database 조작 (0) | 2022.04.03 |
[Android / Java] Cloud Firestore 연동을 통한 Data 조작(feat. RecyclerView) (0) | 2022.03.27 |