티스토리 뷰

반응형

숭실대학교 커뮤니티 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






반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31