그래서 코드를 아래와 같이 구현해서 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
댓글 없음:
댓글 쓰기