안드로이드 개발 인터넷 연결(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", "인터넷이 연결되지 않았습니다. ");
    }
}


Posted by 녹두장군