티스토리 뷰
숭실대학교 커뮤니티 SSUmunity 에서 학우들의 스마트한 캠퍼스라이프를 위해
학교 커뮤니티 + 학사관리(유세인트) 기능을 통합한 ' SSULiTE ' 어플리케이션을 개발하고 있다.
<링크 : https://play.google.com/store/apps/details?id=org.ssumunity.ssulite >
SSULiTE 2차 릴리즈 내용에 네트워크 상태에 따른 예외처리 핸들링을 포함하여 업데이트를 올렸다.
플레이스토어에 업데이트 버전이 올라간 후, 10분도 채 지나지 않아
오류를 수집하여 알려주는 Firebase crash reports가 올라왔다.
오류 내용은 네트워크 연결 상태가 NULL 이라 예외처리 핸들링 케이스에서 벗어나는 경우였다.
1 2 3 4 5 | Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.net.NetworkInfo.isConnected()' on a null object reference org.ssumunity.ssulite.BaseApplication.isNetworkConnected (BaseApplication.java:81) org.ssumunity.ssulite.ui.splash.SplashActivity.checkUpdate (SplashActivity.java:70) org.ssumunity.ssulite.ui.splash.SplashActivity.onCreate (SplashActivity.java:48) | cs |
에러가 발생한 기기는 Nexus 7 - 태블릿 이였으며, 연결상태는 WIFI 였는데,
스마트폰의 네트워크 상태 중 [ WIFI, MOBILE 네트워크 ] 를 체크하는 코드를 벗어나
NULL 값을 리턴하여 발생하는 문제 였다.
이제부터 위의 문제를 해결하면서 깨달은 스마트폰, 태블릿의 네트워크 연결 상태를 체크하는 방법을 소개하도록 하겠다.
1. Manifests에 권한 추가하기
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
안드로이드 Manifests 파일에 INTERNET 권한과 ACCESS_NETWORK_STATE 권한 을 등록 해준다.
CHANGE_NETWORK_STATE 권한 은 BroadCast Receiver 로 특정 네트워크 상태를 체크하여
특정 네트워크를 키거나 끄는 기능이 필요한 경우에 해당 권한을 추가로 등록 해줘야한다.
2. 네트워크 연결 상태 확인하기 (스마트폰 네트워크 상태 체크)
public static boolean isNetworkConnected(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mobile.isConnected() || wifi.isConnected())
return true;
else
return false;}
많은 분들이 위와 같은 코드로 스마트폰의 네트워크 상태를 체크하고 있으리라 생각된다.
하지만, 위의 코드의 경우 태블릿의 wifi 연결 상태를 체크하지 못하는 상황이 발생한다.
도대체 왜 ? 태블릿의 wifi 연결 상태를 체크하지 못하는 것일까 ?
우선 네트워크 상태 종류에는
manager.getNetworkInfo(ConnectivityManager.TYPE_BLUETOOTH); // 블루투스
manager.getNetworkInfo(ConnectivityManager.TYPE_DUMMY); // 임의 데이터 연결 (실제 기기에서 사용 불가 )
manager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET); // 이더넷 네트워크 연결은 기본적으로 이 네트워크 유형을 사용
manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); // 모바일 네트워크 연결은 기본적으로 이 네트워크 유형을 사용
manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_DUN); // Dial-Up Network -> 모바일 테더링(핫스팟) 네트웤,
manager.getNetworkInfo(ConnectivityManager.TYPE_VPN); // VPN -> 가상 네트워크 사용시
manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); // WIFI 네트워크 연결은 기본적으로 이 네트워크 유형을 사용
manager.getNetworkInfo(ConnectivityManager.TYPE_WIMAX); // WIFI 단점을 보완한 향상된 WIFI 네트워크 유형// (Wibro 라고도 함.)
이렇게나 많다.
여기서 태블릿의 네트워크 유형에는 WIMAX 가 해당되는데. 해당 상태를 추가적으로 체크해 주면 된다.
3. 네트워크 연결 상태 확인하기 (태블릿 + 스마트폰 네트워크 상태 체크)
public static boolean isNetworkConnected(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo wimax = manager.getNetworkInfo(ConnectivityManager.TYPE_WIMAX);
boolean bwimax = false;
if (wimax != null)
bwimax = wimax.isConnected(); // wimax 상태 체크
if (mobile != null) {
if (mobile.isConnected() || wifi.isConnected() || bwimax)
// 모바일 네트워크 체크
return true;
} else {
if (wifi.isConnected() || bwimax)
// wifi 네트워크 체크
return true;
}
return false;
}
위의 코드로 태블릿의 wifi 네트워크 상태까지 확인해 줄 수 있다.
하지만, 현재 getNetworkInfo() 가 deprecated 되어 getActiveNetworkInfo() 를 사용 하길 권장하고 있다.
4. 네트워크 연결 상태 확인하기 getActiveNetworkInfo();
NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
activeNetworkInfo.getState();
activeNetworkInfo.getDetailedState();
activeNetworkInfo.getType();
activeNetworkInfo.getSubtype();
activeNetworkInfo.getTypeName();
activeNetworkInfo.getReason();
activeNetworkInfo.getReason();
위의 코드로 네트워크 상태를 체크하여 네트워크 별로 액션을 취해주는것을 현재 권장 하고 있다 :D
'Android' 카테고리의 다른 글
Mobile App - Remote Config (0) | 2023.01.12 |
---|---|
안드로이드 TextView에서 글자수 초과 표시 && singleLine deprecated 대처 방법 (0) | 2017.07.17 |
안드로이드 api 버전별 Status Bar 테마 커스터마이징하기 (0) | 2017.07.08 |