아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
털털한불곰31
털털한불곰3121.03.31

안드로이드에서 wifi 말고 mobile 로만 서버와 통신하는 방법은 뭘가요?

wifi , lte mobile 이 다 켜진 상태일 경우

HttpURLConnection

로 서버와 통신할 때

실제로는 연결이 차단된 상태일 수 있는 wifi 가 아닌

mobile 로만 통신하도록 설정하는 방법이 있을가요?

55글자 더 채워주세요.
답변의 개수
5개의 답변이 있어요!
  • 질문의 의도를 제가 잘 이해한것이 맞는지는 모르겠으나

    우선 데이터 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에서 찾아볼 수 있습니다.

    http://2cpu.co.kr/bbs/board.php?bo_table=QnA&wr_id=652373


  • 안녕하세요.

    말씀하신 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 입니다.