안드로이드에서 wifi 말고 mobile 로만 서버와 통신하는 방법은 뭘가요?
wifi , lte mobile 이 다 켜진 상태일 경우
HttpURLConnection로 서버와 통신할 때
실제로는 연결이 차단된 상태일 수 있는 wifi 가 아닌
mobile 로만 통신하도록 설정하는 방법이 있을가요?
질문의 의도를 제가 잘 이해한것이 맞는지는 모르겠으나
우선 데이터 ex)3G/4G 로만 연결됬을때 통신을 하고싶다고 하신것같습니다.
https://onedaycodeing.tistory.com/33
해당 게시글을 참조하여
현재 연결된 상태가 데이터인지 와이파이인지를 구분해서 분기처리하셔서 통신하시면 될것같습니다.
안드로이드 앱에서 외부 인터넷으로 데이터를 주고 받기 위해서는 연결을 확인해야 합니다. 우리가 사용할 수 있는 외부 연결망은 3G/4G 와 WI-FI 입니다. 3G/4G 는 기지국을 통해서 데이터 전송 받기 때문에 통신사에 데이터 요금을 지불해야 합니다. 하지만 WI-FI 는 접근만 할 수 있으면 무료로 사용할 수 있습니다. 가정용, 핫스팟용, 기업용이 있는데, 주로 개인들은 공유기를 이용해서 와이파이 존을 만들어서 사용합니다.
▼ 안드로이드에서 네트워크를 사용하기 위해서는 다음과 같은 퍼미션이 필요합니다. AndroidManifest.xml 에 두 가지 퍼미션을 추가합니다.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />▼ 인터넷이 정상적으로 연결이 되었는지 확인하기 위한 함수는 다음과 같습니다. ConnectivityManager 객체를 리턴받은 후 ConnectivityManager 의 Type 별로 인터넷 연결 여부를 확인합니다. TYPEMOBILE 은 기지국을 통한 3G, 4G 와의 연결을 말하며, TYPEWIFI 가 와이파이 연결여부를 판단하기 위한 Type 값입니다.
public boolean isConnection(){ ConnectivityManager manager = (ConnectivityManager) mContext.getSystemService (Context.CONNECTIVITY_SERVICE); boolean isMobileAvailable = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable(); boolean isMobileConnect = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting(); boolean isWifiAvailable = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable(); boolean isWifiConnect = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting(); if ((isWifiAvailable && isWifiConnect) || (isMobileAvailable && isMobileConnect)){ return true; }else{ return false; } } ▼ 2G, 3G, 4G 를 구분할 수 있는 함수 입니다. public String getNetworkName() { TelephonyManager mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); int networkType = mTelephonyManager.getNetworkType(); switch (networkType) { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: return "2G"; case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: case TelephonyManager.NETWORK_TYPE_HSPAP: return "3G"; case TelephonyManager.NETWORK_TYPE_LTE: return "4G"; default: return "Unknown"; } } 이렇게 위의 함수로 WIFI 가아닌 3G,4G 등의 상태일때에만 통신하게 하시면 됩니다. 감사합니다.제가 안드로이드에서 코딩을 해본적은 없지만 해외 포럼에서 비슷한 고민을 하시는 개발자분들이 계시고... 관련 답변을 보니 아래의 내용이 가장 신빙성이 있어보입니다.
ConnectivityManager 클래스를 이용하세요.
Mobile Data와 Wifi 가 모두 활성화상태이면 Wifi를 사용하는 것이 Default 값 입니다.
다음의 코드를 이용해 Mobile Data를 사용하도록 전환한 뒤 HTTP 연결을 시도합니다.
ConnectivityManager cm; cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
작업을 마치면 다시 원래의 Default로 복원하는 것을 잊지 마세요.
cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);
도움이 되셨기를..
안녕하세요 제가 구글 검색을 해 보았는데 와이파이와 LTE를 동시에 사용하는 방법은 있는 것 같습니다. url은 아래와 같습니다.
http://blog.naver.com/PostView.nhn?blogId=bsmouse&logNo=221638598130
그리고 기본적으로는 와이파이를 꺼야만 가능한데 그 이유는 아래 url에서 찾아볼 수 있습니다.
안녕하세요.
말씀하신 API는 default로 현재 valid한 network을 사용하게 되있습니다. 이를 강제로 mobile을 사용하게 하는 것은 아래와 같습니다.
https://stackoverflow.com/questions/25931334/send-request-over-mobile-data-when-wifi-is-on-android-l그리고 Android developer site를 보면 아래와 같은 방법을 쓰실수 있습니다. API level 28전에는
ConnectivityManager cm; cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);이와 같이 하시면 되었는데요, 이 부분이 deprecate되어서 아래를 사용하라고 안내가 되고 있고,
https://developer.android.com/reference/android/net/ConnectivityManager#TYPE_MOBILE안내된
https://developer.android.com/reference/android/net/NetworkCapabilities#hasTransport(int)방법을 쓴것이
stackoverflow이 답변으로 있어서 그 링크를 처음에 추가하였습니다.
여기에서 TYPE_MOBILE과 같은 것이 TRANSPORT_CELLULAR 입니다.