|
안드로이드 개발 인터넷 연결(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 |
