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();
}
}
}