본문 바로가기

Kotlin/안드로이드 공부

안드로이드 네트워크 연결 상태 확인하기

728x90

원래는 getNetworkInfo 를 이용하여 네트워크 상태를 가져올 수 있다.

그런데 API29 에서 deprecated 되었다고 하여 새로운 방법을 찾아보았다. 

class NetworkConnectionStateMonitor(context: Context) : ConnectivityManager.NetworkCallback() {

    private var context: Context? = null
    private var networkRequest: NetworkRequest? = null
    private var connectivityManager: ConnectivityManager? = null

    init {
        this.context = context
        this.networkRequest =
            NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()
    }

    fun register() {
        connectivityManager =
            context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connectivityManager!!.registerNetworkCallback(networkRequest!!, this)
    }

    fun unregister() {
        connectivityManager!!.unregisterNetworkCallback(this)
    }

    override fun onAvailable(network: Network) {
        super.onAvailable(network)
        // Do what you need to do here
        // 네트워크가 연결되었을 때 할 동작
        Toast.showShort("network available")
    }

    override fun onLost(network: Network) {
        super.onLost(network)
        // Do what you need to do here
        // 네트워크 연결이 끊겼을 때 할 동작
        Toast.showShort("network lost")
    }
}
lateinit var networkConnectionStateMonitor: NetworkConnectionStateMonitor

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    networkConnectionStateMonitor = NetworkConnectionStateMonitor(this)
    networkConnectionStateMonitor.register()
}

override fun onDestroy() {
    networkConnectionStateMonitor.unregister()
    super.onDestroy()
}

생명주기에 네트워크 콜백을 등록하여 네트워크 상태 변경을 감지할 수 있다.

그런데 나는 사실 굳이 실시간으로 받아올 필요가 전혀 없었다. 

스플래시 화면과 API call 하기 전에 확인이 필요할 뿐.. 실시간으로 연결이 끊어지는건 상관이 없다.

 

그래서 NetworkConnectionStateMonitor 클래스에 상태를 가져와서 확인할 수 있는 함수를 만들었다.

 fun isNetworkAvailable(): Boolean {
        val nw: Network = connectivityManager?.activeNetwork ?: return false
        val actNw: NetworkCapabilities =
            connectivityManager?.getNetworkCapabilities(nw) ?: return false
        return when {
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                Toast.showShort("wifi 연결됨")
                true
            }
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                Toast.showShort("cellular 연결됨")
                true
            }
            //for other device how are able to connect with Ethernet
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                Toast.showShort("ethernet 연결됨")
                true
            }
            //for check internet over Bluetooth
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> {
                Toast.showShort("bluetooth 연결됨")
                true
            }
            else -> false
        }
    }

 

근데 그냥 getNetworkInfo 쓰면 안되는건가..ㅋㅋㅋ