[Android] 안드로이드 인터넷 연결 여부와 종류 확인하기
스마트폰의 통신은 크게 와이파이와 연결된 상태와 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) {
// 네트워크가 끊겼을 때
}
});
참고
'if (study) > Android' 카테고리의 다른 글
[Android] SQLite 사용하기 - 데이터베이스와 테이블 생성, 삽입, 조회 (0) | 2019.09.09 |
---|---|
[Android] 안드로이드의 4대 컴포넌트 (구성 요소) (0) | 2019.08.29 |
[Android] 안드로이드의 레이아웃 인플레이션(Layout Inflation) (0) | 2019.08.28 |