[Android] 네트워크 연결 상태 확인하기

김병수·2021년 10월 24일
0
post-thumbnail

최근에 원인을 알 수 없는 버그 때문에 고생을 했는데, 그 원인이 네트워크 연결 때문이었다.
그래서 이 버그를 고치기 위해서, 네트워크 연결이 없는 상태에서는 앱을 사용할 수 없도록 수정했는데,
오늘은 이때 사용한 네트워크 연결 상태 확인 방법에 대해 포스팅하려고 한다.


네트워크 권한 설정

우선 네트워크 연결 상태를 읽기 위해서는,
다음과 같은 2개의 권한을 AndroidManifest.xml에 추가해야 한다.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

네트워크 상태 읽기

아래의 내용은 안드로이드 공식 문서를 참고해서 작성한 내용입니다.

  1. Android 기기의 ConnectivityManager 객체를 가져온다.
  2. ConnectivityManager 객체를 사용하여 앱의 기본 네트워크 정보를 가지고 있는 Network 객체를 가져온다.
  3. 1과 2에서 얻은 2개의 객체를 사용하여 NetworkCapabilities 객체를 가져온다.
  4. 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_CELLULARNetworkCapabilities.TRANSPORT_WIFI를 사용하여 Cellular와 Wifi 연결 상태를 확인하고 있다.
이외의 Bluetooth, VPN 등의 연결 상태를 확인하고 싶다면 안드로이드 공식 문서를 참고하면 될 것 같다.

이 상태에서 네트워크 상태를 확인하고 싶은 부분에 아래의 코드를 추가하면 된다.

// 네트워크가 연결되어 있지 않은 경우
if (!NetworkManager.checkNetworkState(this)) {
            
}
// 네트워크가 연결되어 있는 경우
else {
            
}

마무리

이번 포스팅에서 작성한 내용은 순간적인 네트워크 상태를 읽어오는 방법이다.
따라서 네트워크 연결이 시작되거나, 끝나는 이벤트를 받아오는 작업을 하기에는 어려움이 있다.
다음 포스팅에서는 네트워크 연결 및 종료 이벤트에 대하여 콜백 함수를 호출하는 방법에 대하여 포스팅할 예정이다.

profile
주니어 안드 개발자

0개의 댓글