스마트폰의 통신은 크게 와이파이와 연결된 상태3G/LTE로 연결된 상태로 나누어볼 수 있다.

이번 글에서는 네트워크 상태에 따라 적절한 처리를 할 수 있도록 인터넷 연결 여부와 연결의 종류를 확인하는 방법을 정리하려 한다.

사용자 권한 요청

먼저 단말기의 인터넷 연결 상태에 접근할 수 있도록 권한을 요청해야한다. manifest에 아래의 코드를 추가한다.

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

인터넷 연결 여부 확인

연결 상태를 확인하기 위해 ConnectivityManager 객체가 필요하다. ConnectivityManager를 사용하면 인터넷에 실제로 연결되어 있는지, 연결되어 있다면 어떤 유형의 연결인지 확인할 수 있다.


시스템 서비스 객체를 가져오기 위해서 getSystemService() 메서드를 사용한다.
getActiveNetworkInfo() 메서드는 네트워크 접속 정보를 얻는데 사용한다.

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();

boolean isConnected = (networkInfo != null && networkInfo.isConnectedOrConnecting());

아래는 인터넷 연결 상태를 확인하는 메서드를 포함한 클래스의 예시이다.

public class NetworkStatus {

 public static boolean isConnected(Context context) {
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo networkInfo = manager.getActiveNetworkInfo();

     return networkInfo != null && networkInfo.isConnectedOrConnecting();
 }
}

연결의 종류 확인

연결의 타입을 확인할 땐 getType() 메서드를 사용한다. 연결의 종류는 ConnectivityManager 클래스에 상수로 정의되어 있다.

    switch (networkInfo.getType()) {
        case ConnectivityManager.TYPE_MOBILE:
            System.out.println("3G/LTE 연결");
            break;

        case ConnectivityManager.TYPE_WIFI:
            System.out.println("WIFI 연결");
            break;
    }


API 29 이후

NetworkInfo 클래스는 api level 29에서 deprecated 되었다.
공식 문서를 읽어보면 대신 ConnectivityManager.NetworkCallback를 사용하라고 나와있다.
NetworkCallback 클래스는 네트워크 상태가 변경되었을 때 브로드캐스트 메세지를 수신하는 대신 콜백을 호출한다.


NetworkRequest는 네트워크에 대한 요청을 정의한다.

NetworkRequest.Builder로 만들어진 객체에는 builder.addCapability(...).addCapability(...); 이런 식으로 콜백에 대한 설정을 지정할 수 있다.

  • addCapability(int capability) : 특정한 요구사항을 만족하는 통신에 대해서 콜백을 호출하도록 설정한다.
  • addTransportType(int transportType) : 특정 종류의 통신에 대해서 콜백을 호출하도록 설정한다.

예시 코드

NetworkRequest.Builder builder = new NetworkRequest.Builder();
        manager.registerNetworkCallback(builder.build(), new ConnectivityManager.NetworkCallback(){
            @Override
            public void onAvailable(@NonNull Network network) {
                // 네트워크를 사용할 준비가 되었을 때
            }

            @Override
            public void onLost(@NonNull Network network) {
                // 네트워크가 끊겼을 때
            }
        });

 

 

참고