본문 바로가기

Android/개념 및 예제

[안드로이드/Android] 기기 네트워크 연결 상태 확인

앱 내에서 네트워크 연결을 확인해야 할 상황이 많이 있다.

예를 들어 실시간 방송 중 네트워크가 끊겼다면?, 채팅을 보낼 때 인터넷이 연결이 안 되는 상황이면? 등등

 

사용자가 네트워크에 연결이 됐는지 안 됐는지, 

연결이 됐다면 와이파이인지 셀룰러 통신(3G, LTE, 5G)을 사용하고 있는지를 알기 위한 코드이다.

* 셀룰러 통신 : 주파수 자원을 효율적으로 활용해 기지국을 공간적으로 확장하는 이동통신 

 

- 네트워크 연결 상태를 토스트 메세지로 띄우도록 한 결과 화면입니다.

 

- 메니페스트 파일

네트워크 상태 접근하기 위한 권한 추가

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

 

 

- 네트워크 연결 확인 java 코드

public void getConnectivityStatus(Context context) {
        // 네트워크 연결 상태 확인하기 위한 ConnectivityManager 객체 생성
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (cm != null) {

            // 기기가 마시멜로우 버전인 Andorid 6 이상인 경우
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                // 활성화된 네트워크의 상태를 표현하는 객체
                NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());

                if (nc != null) {

                    if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                        Toast.makeText(context, "와이파이 연결됨", Toast.LENGTH_SHORT).show();
                    } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                        Toast.makeText(context, "셀룰러 통신 사용", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(context, "인터넷 연결 안됨", Toast.LENGTH_SHORT).show();
                }

            } else {

                // 기기 버전이 마시멜로우 버전보다 아래인 경우
                // getActiveNetworkInfo -> API level 29에 디플리케이트 됨
                NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
                if (activeNetwork != null) {
                    // 연결된 네트워크 확인
                    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                        Toast.makeText(context, "와이파이 연결됨", Toast.LENGTH_SHORT).show();
                    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                        Toast.makeText(context, "셀룰러 통신 사용", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(context, "인터넷 연결 안됨", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

- 특이사항

네트워크 연결 여부 정보를 가져오기 위한 Networkinfo 클래스의 getActiveNetworkInfo()는 API 29에서 deprecated 됐습니다.

마시멜로우 버전 이상일 경우, 이하일 경우 네트워크 연결 확인하는 방법이 다름

 

- 참고 

https://m.blog.naver.com/PostView.nhn?blogId=jogilsang&logNo=221571963859&proxyReferer=https:%2F%2Fwww.google.com%2F

https://developer.android.com/training/monitoring-device-state/connectivity-status-type

http://www.ktword.co.kr/abbr_view.php?m_temp1=472