안드로이드 개발 인터넷 연결(WI-FI, 3G, 4G) 구분해서 연결 확인하는 방법 |
환경: Android Studio 3.0 |
안드로이드 앱에서 외부 인터넷으로 데이터를 주고 받기 위해서는 연결을 확인해야 합니다. 우리가 사용할 수 있는 외부 연결망은 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 별로 인터넷 연결 여부를 확인합니다. TYPE_MOBILE 은 기지국을 통한 3G, 4G 와의 연결을 말하며, TYPE_WIFI 가 와이파이 연결여부를 판단하기 위한 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"; } }
▼ 현재 연결이 와이파이인지 모바일인지 구분해서 문자열을 받습니다.
public String getNetworkType(){ String networkType = null; ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo network = connectivityManager.getActiveNetworkInfo(); if (network != null) { // connected to the internet if (network.getType() == ConnectivityManager.TYPE_WIFI) { networkType = "WiFi"; } else if (network.getType() == ConnectivityManager.TYPE_MOBILE) { networkType = "Mobile"; } } else { // not connected to the internet } return networkType; }
▼ 인터넷 연결 상태를 구현한 클래스 전체 소스 입니다.
import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.telephony.TelephonyManager; /** * Created by gon on 2018-02-03. */ public class NetworkManager { private Context mContext; private static NetworkManager networkManager; NetworkManager(Context context){ this.mContext = context; } public static NetworkManager getInstance(Context context){ if (networkManager != null) { networkManager = new NetworkManager(context); } return networkManager; } 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; } } 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"; } } public String getNetworkType(){ String networkType = null; ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo network = connectivityManager.getActiveNetworkInfo(); if (network != null) { // connected to the internet if (network.getType() == ConnectivityManager.TYPE_WIFI) { networkType = "WiFi"; } else if (network.getType() == ConnectivityManager.TYPE_MOBILE) { networkType = "Mobile"; } } else { // not connected to the internet } return networkType; } }
▼ Activity 에서 NetworkManager 클래스를 다음과 같이 이용해서 구현했습니다. isConnection() 함수로 네트워크 접속 여부를 판단한 후 3G/4G 인지 아니면 WIFI 접속인지 getNetworkType() 으로 판단했습니다.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shared_preferences); NetworkManager net = NetworkManager.getInstance(this); if (net.isConnection()) { if (net.getNetworkType().equals("Mobile")) { String mobile = net.getNetworkName(); Log.d("Mobile sort", mobile); }else{ Log.d("Wifi", net.getNetworkType()); } }else{ Log.d("CONNECT STATE", "인터넷이 연결되지 않았습니다. "); } }
'안드로이드 개발' 카테고리의 다른 글
안드로이드 개발 ArrayList 배열 개체를 JSON 으로 변경하는 방법 (1) | 2018.08.28 |
---|---|
안드로이드 개발 간단하게 위젯 만드는 방법 (0) | 2018.08.15 |
안드로이드 개발 엑셀 파일 생성 및 데이터 불러오는 방법 (3) | 2018.08.07 |
안드로이드(Android) 개발 Timer 구현하는 방법 (0) | 2018.07.05 |
안드로이드 개발 SharedPreferences 객체와 배열 저장을 위한 gson 사용하는 방법 (3) | 2018.04.13 |
안드로이드 개발 에뮬레이터 앱 db 조회 하는 방법 (0) | 2018.04.11 |
안드로이드 개발 Android GPS 정보 알아오기 (63) | 2018.04.07 |
안드로이드 콘솔에서 adb shell 에러 해결하는 방법 (0) | 2018.03.30 |