안드로이드 네트워크 상태 확인 기법

1. 현재 네트워크 유형 확인 방법


public static int getCurrentNetworkType(Context context) {
    NetworkManager connectivityManager = (NetworkManager) context.getSystemService(Context.NETWORK_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
        return activeNetworkInfo.getType();
    } else {
        return NetworkStatus.NO_CONNECTION;
    }
}

주요 네트워크 유형 상수:

  • NetworkManager#MOBILE_NETWORK - 이동통신망
  • NetworkManager#WIFI - 와이파이
  • NetworkManager#WIMAX - 무선 도시권망 (해외 사용)
  • NetworkManager#ETHERNET - 이더넷
  • NetworkManager#BLUETOOTH - 블루투스

2. 통신사 정보 확인 방법


public static String getCarrierName(Context context){
    TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
    String carrierCode = telecomManager.getNetworkOperator();
    switch (carrierCode) {
        case "46000":
        case "46002":
        case "46007":
            return "中国移动";
        case "46001":
        case "46006":
            return "中国联通";
        case "46003":
        case "46005":
        case "46011":
            return "中国电信";
        case "41004":
            return "移动香港";
        default:
            return "알 수 없는 통신사";
    }
}

3. 이동통신 세대 확인 방법


public static String getNetworkGeneration(Context context){
    TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
    int networkType = telecomManager.getNetworkType();
    switch (networkType) {
        // 2G 네트워크
        case TelecomManager.NETWORK_TYPE_GPRS:
        case TelecomManager.NETWORK_TYPE_CDMA:
        case TelecomManager.NETWORK_TYPE_EDGE:
        case TelecomManager.NETWORK_TYPE_1xRTT:
        case TelecomManager.NETWORK_TYPE_IDEN:
            return "2G";
        // 3G 네트워크
        case TelecomManager.NETWORK_TYPE_EVDO_A:
        case TelecomManager.NETWORK_TYPE_UMTS:
        case TelecomManager.NETWORK_TYPE_EVDO_0:
        case TelecomManager.NETWORK_TYPE_HSDPA:
        case TelecomManager.NETWORK_TYPE_HSUPA:
        case TelecomManager.NETWORK_TYPE_HSPA:
        case TelecomManager.NETWORK_TYPE_EVDO_B:
        case TelecomManager.NETWORK_TYPE_EHRPD:
        case TelecomManager.NETWORK_TYPE_HSPAP:
            return "3G";
        // 4G 네트워크
        case TelecomManager.NETWORK_TYPE_LTE:
            return "4G";
        // 5G 네트워크
        case TelecomManager.NETWORK_TYPE_NR:
            return "5G";
        default:
            return "알 수 없는 네트워크";
    }
}

4. SIM 카드 ICCID 정보 확인 방법


TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
String iccid = telecomManager.getSimSerialNumber();

5. 신호 강도 측정 방법


mTelephonyManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
// 신호 강도 모니터링 시작
mPhoneStateListener = new PhoneStateMonitor();
// 신호 강도 리스너 등록
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

private class PhoneStateMonitor extends PhoneStateListener {
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        analyzeSignalStrength(signalStrength);
        
        // 안드로이드 6.0 이상에서 사용 가능한 신호 레벨 표시
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int signalLevel = signalStrength.getLevel();
            updateSignalUI(signalLevel);
        }
        
        // 다양한 통신 방식별 신호 강도 로그 출력
        logSignalStrengths(signalStrength);
    }
    
    private void logSignalStrengths(SignalStrength signalStrength) {
        int cdmaDbm = signalStrength.getCdmaDbm();
        int evdoDbm = signalStrength.getEvdoDbm();
        
        Log.d("SignalInfo", "CDMA 신호 강도: " + cdmaDbm + " dBm");
        Log.d("SignalInfo", "EVDO 신호 강도: " + evdoDbm + " dBm");
        
        // LTE 신호 강도 확인
        for(CellSignalStrength cellSignal : signalStrength.getCellSignalStrengths()){
            if(cellSignal instanceof CellSignalStrengthLte) {
                int rsrp = cellSignal.getDbm();
                Log.d("LTE_Signal", "RSRP: " + rsrp + " dBm");
            }
        }
    }
}

신호 강도 기준 (dBm 단위):

  • -40 ~ -50: 기지국 근처
  • -50 ~ -60: 매우 좋은 신호
  • -60 ~ -70: 양호한 신호
  • -70 ~ -80: 약간 약한 신호
  • -80 ~ -90: 약한 신호
  • -90 ~ -100: 기본 통화 가능 상태
  • -110 ~ -170: 기본적으로 신호 없음

6. 이동 데이터 연결 상태 변화 감지 방법


IntentFilter networkFilter = new IntentFilter();
networkFilter.addAction(NetworkConstants.SIM_STATE_CHANGED);
context.registerReceiver(networkStateReceiver, networkFilter);

NetworkConstants 클래스:


public final class NetworkConstants {
    public static final String SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
}

public class NetworkStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (NetworkConstants.SIM_STATE_CHANGED.equals(action)) {
            handleSimStateChange(context);
        }
    }
    
    private void handleSimStateChange(Context context) {
        TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
        int simState = telecomManager.getSimState();
        
        switch (simState) {
            case TelephonyManager.SIM_STATE_READY:
                checkNetworkConnection(telecomManager);
                break;
            case TelephonyManager.SIM_STATE_UNKNOWN:
            case TelephonyManager.SIM_STATE_ABSENT:
            case TelephonyManager.SIM_STATE_PIN_REQUIRED:
            case TelephonyManager.SIM_STATE_PUK_REQUIRED:
            case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
            default:
                handleNoSimCard();
                break;
        }
    }
    
    private void checkNetworkConnection(TelecomManager telecomManager) {
        int networkType = telecomManager.getNetworkType();
        if (networkType > 0 && networkType < 16) {
            establishNetworkConnection();
        }
    }
}

태그: 안드로이드 네트워크 통신 TelephonyManager ConnectivityManager

5월 29일 19:46에 게시됨