안드로이드 앱, 태블릿 PC에서만 인터넷 체크 구문 익셉션

2018. 1. 17. 21:48 안드로이드/Error


익셉션 모두 앱을 시작할 때 onstart() 메소드안에 구현해 놓은 인터넷 접속 여부를 체크하는 구문에서 발생했습니다. 익셉션이 다발로 터지고 있던 구문은 다음과 같습니다.


cManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

 

NetworkInfo mobile;

NetworkInfo wifi;

 

mobile = cManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

wifi = cManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

 

if (mobile.isConnected() || wifi.isConnected()) {

  Toast.makeText(MainActivity.this, "환영!", Toast.LENGTH_LONG).show();

} else {

  Toast.makeText(MainActivity.this, "네트워크확인", Toast.LENGTH_LONG).show();

}


태블릿 PC를 구매할 때, 통신 요금제 적용을 받지 않는 '와이파이 전용' 태블릿 PC가 있다는 사실이 떠올랐습니다. 그렇다면 와이파이 전용 태블릿 PC에서는 'ConnectivityManager'나 'ConnectivityManager.TYPE_MOBILE' 중 하나가 null 값을 리턴 할수도 있겠다는 생각이 들었습니다. 이 가설을 가지고 스택오버플로우에 검색을 해보니 아니나 다를까 이미 이 문제로 앱이 crush 돼 문의를 올린 사례가 많았습니다.


스택오버플로우는 위대합니다. 제가 겪고 있는 문제는 이미 누군가가 다 겪었던 문제로군요.


어쨌든 와이파이 전용 태블릿 PC를 위해서 코드를 몇 줄 더 추가해서 인터넷 접속 여부를 확인하는 구문은 아래와 같이 방어 코딩하여 수정하였습니다.


ConnectivityManager cManager = null;

cManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

 

// ConnectivityManager가 null일 경우를 위한 방어 코딩

if (cManager != null) {

   

  NetworkInfo mobile;

  NetworkInfo wifi;

    

  mobile = cManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

  wifi = cManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

 

  // ConnectivityManager.TYPE_MOBILE이 리턴되지 않는 경우를 대비한 방어 코드 추가

  if (mobile != null && mobile.isConnected() || wifi.isConnected()) {

    Toast.makeText(MainActivity.this, "환영!", Toast.LENGTH_LONG).show();

  } else {

    Toast.makeText(MainActivity.this, "네트워크확인", Toast.LENGTH_LONG).show();

  }

 

} else {

  return;

}


이렇게 컨넥티비티매니저와 TYPE_MOBILE이 null로 리턴되는 경우를 위해 방어 코딩을 추가하니 태블릿 PC 에서 앱을 시작할 때 발생하던 익셉션이 하나도 발생하지 않게 되었습니다.


문제를 해결하고나니 허탈한 기분까지 들었습니다. 안드로이드 개발의 경우에는 기기도 다양하고 특수 상황도 많아서 정말 다양한 환경에 대응을 해야하는데 이번 경우는 정말 문제 원인을 알아내는 것도 힘들었고 수수께끼를 푸는 기분이었습니다.


참고자료 : http://investor-js.blogspot.kr/2014/06/pc.html