-->

[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

 

네트워크 상태 읽기  |  Android 개발자  |  Android Developers

네트워크 상태 읽기 알림 이 페이지를 개발자 프로필에 저장하여 중요 업데이트에 대한 알림을 받으세요. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. And

developer.android.com

 

+ Recent posts