티스토리 뷰

안드로이드

네트워크 상태 체크

성현아빠 2020. 8. 26. 17:04

네트워크 상태체크 방법이 바뀐걸 이제야 알았다. ㅠㅠ

기존에는 네트워크 상태값을 읽어서 확인했는데, 

이제는 네트워크 상태 callback을 등록해서 네트워크 상태값을 callback으로 전달받는다.

 

Wifi와 mobile 네트워크 같이 callback을 받으니 구분이 안되서 각각 만들어줬다..

다른 방법이 있을까 테스트하며 찾아봐야겠다.

 

준비작업

    private var isOnlineWifi = false
    private var isOnlineMobile = false
    private lateinit var cm: ConnectivityManager
    private lateinit var networkBuilder: NetworkRequest.Builder
    private val wifiCallback = @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                super.onAvailable(network)

                Log.d("테스트", "WIFI::네트워크 연결")
                isOnlineWifi = true
            }

            override fun onLost(network: Network) {
                super.onLost(network)

                Log.d("테스트", "WIFI::네트워크 해제")
                isOnlineWifi = false
            }
        }
    private val mobileCallback = @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)

            Log.d("테스트", "모바일::네트워크 연결")
            isOnlineMobile = true
        }

        override fun onLost(network: Network) {
            super.onLost(network)

            Log.d("테스트", "모바일::네트워크 해제")
            isOnlineMobile = false
        }
    }

onCreate()에서 callback 등록

        if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.LOLLIPOP) {
            cm = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

            networkBuilder = NetworkRequest.Builder()
            networkBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            cm.registerNetworkCallback(networkBuilder.build(), wifiCallback)

            networkBuilder = NetworkRequest.Builder()
            networkBuilder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
            cm.registerNetworkCallback(networkBuilder.build(), mobileCallback)
        }

 

onDestory()에서 callback 등록취소(unregister) 

        if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.LOLLIPOP) {
            cm.unregisterNetworkCallback(wifiCallback)
            cm.unregisterNetworkCallback(mobileCallback)
        }

 

연결상태 확인

    @Suppress("DEPRECATION")
    fun isNetworkAvailable(context: Context): Boolean {
        (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                getNetworkCapabilities(activeNetwork)?.run {
                    when {
                        hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                        hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                        else -> false
                    }
                } ?: false
            } else {
                val wifi = getNetworkInfo(ConnectivityManager.TYPE_MOBILE)?.state
                if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) {
                    return true
                }
                val mobile =
                    getNetworkInfo(ConnectivityManager.TYPE_MOBILE)?.state

                mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING
            }
        }
    }

 

제발 더이상 바뀌지 말아라... ^^

'안드로이드' 카테고리의 다른 글

ContentResolver 파일경로 가져오기  (0) 2022.05.03
안드로이드 log4j 적용  (0) 2022.01.27
이미지 파일공유(여러파일)  (0) 2020.08.25
미디어파일 저장  (0) 2020.08.25
이미지 zoom & Pinch-to-Zoom  (0) 2020.07.28