날씨 API를 호출 하려면 일단은 현재 핸드폰의 네트워크 상태를 체크해줘야 한다.
그래서 이번엔 앱을 들어가기전에 현재 핸드폰의 네트워크를 체크하려고 한다.
네트워크 연결 체크를 위한 순서는 아래와 같다.
1. manifest 파일에 네트워크 상태에 접근하기 위한 권한 추가.
2. ConnectivityManager 객체 생성
3. NetworkCapabilities 객체 생성
4. 네트워크 상태에 따른 실행문 만들기
그럼 이제 각각의 순서에 대해 자세히 알아보자.
1. manifest 파일에 네트워크 상태에 접근하기 위한 권한 추가.
현재 네트워크 상태에 대한 정보를 얻으려면 manifest파일에 접근을 해야 한다.
소스는 아래와 같다.
<!-- 인터넷 연결 여부를 확인하기 위해 필요한 permission -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. ConnectivityManager 객체 생성
나는 일단 isNetworkAvailable(Context context) 라는 static 메소드를 만들어서 이 함수 내에서 인터넷 연결을
확인 하려고 한다.
일단 static메소드를 사용한 이유는 날씨 api를 또 호출할때가 생길수 있는데 그때마다 네트워크 연결을 체크하는
메소드를 만들어서 하기엔 코드의 재사용성이 떨어지기 때문에 해당 메소드는 static 메소드를 사용하기로 했다.
public static boolean isNetworkAvailable(Context context) {
if(context == null) return false;
}
그래서 일단 해당 메소드 내에서 나는 ConnectivityManager 객체를 만들어서 사용하기로 했다.
ConnectivityManager 는 현재 기기의 인터넷 연결과 관련하여서 설정을 해야할때 사용해야하는 클래스이다.
따라서 ConnectivityManager의 객체를 생성한다.
public static boolean isNetworkAvailable(Context context) {
if(context == null) return false;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //ConnectivityManager 객체 생성
if (connectivityManager != null) {
//connectivityManager를사용할수 있을때 실행될 실행문
}
Log.i("Check InterNet","No internet connection");
return false;
}
3. NetworkCapabilities 객체 생성
NetworkCapabilities 클래스는 현재 어떤 유형으로 네트워크가 연결되어 있는지 확인하기 위한 클래스이다.
원래 기존엔 connectivityManager.getActiveNetworkInfo() 로 현재 네트워크의 유형을 확인할수 있는데
API 29부터 해당 메소드가 deprecated 된다고 해서 나는 NetworkCapabilities 도 사용하기로 했다.
(처음에 NetworkCapabilities 만 사용하려 했으나 나의 에뮬레이터에는 돌아가지 않아 getNetworkInfo() 두개를 사용하기로 했다.)
그럼 이제 NetworkCapabilities 의 객체를 어떻게 생성하는지 소스를 통해 확인해보자.
public static boolean isNetworkAvailable(Context context) {
if(context == null) return false;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //ConnectivityManager 객체 생성
if (connectivityManager != null) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
}
}
else { //API 29 버전 이하라면 아래진입
}
}
Log.i("Check InterNet","No internet connection");
return false;
}
그럼 이제 API 29버전 아래로는 어떻게 해야지 인터넷 연결을 확인할수 있는지 보자.
API 29버전 아래로는 NetworkInfo 클래스를 사용해서 알아볼수 있다.
해당 클래스는 isConnected() 메소드를 통해서 해당 기기가 네트워크와 연결되어 있는지 확인이 가능하다. 소스는 아래와 같다.
public static boolean isNetworkAvailable(Context context) {
if(context == null) return false;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //ConnectivityManager 객체 생성
if (connectivityManager != null) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
//네트워크 연결되어 있는지 확인
}
}
else { //특정 버전 이하라면 아래진입
try {
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); //네트워크 연결 정보 받아옴
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { //네트워크 연결되어 있다면 진입
Log.i("Check InterNet","Internet connection Available");
return true;
}
} catch (Exception e) {
Log.i("Check InterNet","No internet connection");
}
}
}
Log.i("Check InterNet","No internet connection");
return false;
}
해당 메소드는 그냥 연결되어 있는지를 알려주기 때문에 return true를 해서 해당 기기가 네트워크와 연결되어 있다고 알려주면 된다.
그럼이제 위의 NetworkCapabilities 의 네트워크 연결을 어떻게 확인하는지 알아보자.
4. 네트워크 상태에 따른 실행문 만들기
NetworkCapabilities 는 해당 네트워크가 어떤 유형의 네트워크와 연결되어 있는지 확인할수가 있다.
그래서 그걸 확인할수 있는 메소드가 hasTransport(연결유형)이다.
해당 파라미터 안에 연결유형을 넣어서 확인해볼수가 있는데 우리가 해당 메소드에서 확인해볼수있는 연결 유형은
여러가지가 있는데 자세한것은 아래 링크를 통해서 확인해보면 된다.
https://developer.android.com/reference/android/net/ConnectivityManager
나는 TRANSPORT_CELLULAR, TRANSPORT_WIFI, TRANSPORT_ETHERNET 를 사용하였다.
TRANSPORT_CELLULAR는 모바일 데이터가 연결되어 있는지 확인하기 위해서 사용했고
TRANSPORT_WIFI는 wifi와 연결되어 있는지 확인하기 위해서 사용했다.
그리고 TRANSPORT_ETHERNET 는 혹시라도 연결되어 있을 이더넷 통신을 확인하기 위해서 사용했다.
그래서 위의 상황을 모두 고려해야 하닌 조건문은 아래와 같다.
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET))
이렇게 됐을때 접근을 하면 true를 return 하도록 했다.
그럼 해당 메소드의 전체소를 한번 보자.
public static boolean isNetworkAvailable(Context context) {
if(context == null) return false;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //ConnectivityManager 객체 생성
if (connectivityManager != null) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
//네트워크 연결되어 있는지 확인
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
Log.i("Check InterNet","Internet connection Available");
return true;
}
}
}
else { //특정 버전 이하라면 아래진입
try {
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); //네트워크 연결 정보 받아옴
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { //네트워크 연결되어 있다면 진입
Log.i("Check InterNet","Internet connection Available");
return true;
}
} catch (Exception e) {
Log.i("Check InterNet","No internet connection");
}
}
}
Log.i("Check InterNet","No internet connection");
return false;
}
'코딩일기 > 날씨앱 만들기 프로젝트' 카테고리의 다른 글
[AWS] AWS 시작 : AWS 가입하기 (0) | 2021.09.29 |
---|---|
날씨 앱 만들기 : Git에서 API 키 숨기기 (feat. gitignore) (0) | 2021.09.28 |
날씨 앱 만들기 : FusedLocationProvider 사용법 Part 2 (MVVM / Java) (0) | 2021.09.25 |
날씨 앱 만들기 : FusedLocationProvider 사용법 Part 1 (MVVM / Java) (0) | 2021.09.25 |
날씨 앱 만들기 : 기상청 API 분석 및 현재 시간 날씨 정보 받기 (0) | 2021.09.11 |