2017년 6월 25일 일요일

checking Metered network in Android

보통 wifi는 무료라고 생각하기 때문에 wifi가 연결되어 있으면 무료 통신이라고 생각하게됩니다.
그래서 코드를 아래와 같이 구현해서 wifi가 연결되어있을때만 접속하도록 구현하곤 했습니다.

  ConnectivityManager manager = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
  NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  boolean wifi_isConnected;
  if( wifi == null ) wifi_isConnected = false;
  else wifi_isConnected = wifi.isConnected();
  boolean mobile_isConnected;
  if( mobile == null ) mobile_isConnected = false;
  else mobile_isConnected = mobile.isConnected();
  boolean mobile_isRoaming;
  if( mobile == null ) mobile_isRoaming = false;
  else mobile_isRoaming = mobile.isRoaming();
  Log.d("temp"," wifi : " + wifi_isConnected + ", mobile : " + mobile_isConnected + ", roam : " + mobile_isRoaming);

극히 드문 경우이지만 문제는 유료 WIFI에 물려있다거나, wifi는 연결되었지만 active network가 모바일 환경인 경우가 있습니다.

또한 위 코드는 getNetworkInfo(ConnectivityManager.TYPE_WIFI); 와 같은 코드는 더이상 사용하지 않는 것으로 되어있습니다.
그래서 다른 방법을 검토하였습니다. isActiveNetworkMetered() 메소드를 사용하면 됩니다.
해당 메소드는 현재 active되어있는 network이 유료인지 판단할 수 있습니다.

isActiveNetworkMetered

added in API level 16
boolean isActiveNetworkMetered ()
Returns if the currently active data network is metered. A network is classified as metered when the user is sensitive to heavy data usage on that connection due to monetary costs, data limitations or battery/performance issues. You should check this before doing large data transfers, and warn the user or delay the operation until another network is available.

  Network[] nws = manager.getAllNetworks();
  Log.d("temp"," network length : " + nws.length);
  for(int i=0;i<nws.length;i++){
   Network network = nws[i];
   NetworkInfo ni = manager.getNetworkInfo(network);
   Log.d("temp"," type : " + ni.getTypeName() + ", connected :" + ni.isConnected() + ", romming :"+ni.isRoaming());
  }

  Log.d("temp"," isActiveNetworkMetered : " + manager.isActiveNetworkMetered());

실행결과 WIFI 있을때
wifi : true, mobile : false, roam : false
network length : 3
type : WIFI_P2P, connected :false, romming :false
type : MOBILE, connected :true, romming :false
type : WIFI, connected :true, romming :false
isActiveNetworkMetered : false

실행결과 WIFI 없을때
wifi : false, mobile : true, roam : false
network length : 3
type : WIFI_P2P, connected :false, romming :false
type : MOBILE, connected :true, romming :false
type : MOBILE, connected :true, romming :false
isActiveNetworkMetered : true

참고로 테더링한 단말에서는 isActiveNetworkMetered : true 가 됩니다.


manifest.xml에는 아래 내용을 추가해줍니다.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

전체 소스
https://drive.google.com/open?id=0B9vAKDzHthQIT3UteGJReWdPVDQ


댓글 없음:

댓글 쓰기