Android의 TelephonyManager를 사용하여 USIM (유심)의 정보를 추출하여 서비스에서 통신 정보가 필요할 때 사용할 수 있다.
USIM 정보에는 전화번호, 네트워크 정보, 국가 코드 등이 포함되며, 이 정보들은 사용자 식별 및 위치 기반 서비스, 통신 연결 상태를 확인할 수 있다.
이번 포스팅에서는 TelephonyManager를 통해 주요 USIM 정보를 다루는 방법과 개발 시 유용한 포인트들을 짚어보자.
TelephonyManager란?
TelephonyManager는 안드로이드에서 전화 상태 및 장치의 셀룰러 네트워크 정보를 관리하는 클래스다.
TelephonyManager를 통해 SIM 카드, 네트워크 및 통화 상태 정보에 접근할 수 있으며, 이를 통해 다양한 통신 관련 기능을 구현할 수 있다.
TelephonyManager의 주요 기능
TelephonyManager를 통해 얻을 수 있는 대표적인 USIM 정보는 다음과 같다
- SIM 상태: getSimState() 메서드를 통해 SIM 카드가 정상적으로 장착되었는지, PIN 입력이 필요한지 등을 확인할 수 있다.
- 전화번호: getLine1Number()를 사용하여 전화번호를 가져올 수 있다. 일부 기기에서는 보안 정책상 전화번호를 지원하지 않을 수 있다.
- IMEI/MEID: getImei() 또는 getMeid()를 통해 장치 고유 식별 번호를 확인할 수 있다.
- 국가 코드 및 네트워크 정보: getSimCountryIso(), getNetworkOperator(), getNetworkCountryIso() 등을 통해 SIM 카드와 네트워크의 국가 코드 및 통신사 정보를 가져올 수 있다.
- 네트워크 상태: getNetworkType(), getDataState()를 통해 네트워크의 유형 (LTE, 3G 등) 및 데이터 연결 상태를 확인할 수 있다.
TelephonyManager 사용 시 권한 설정
TelephonyManager를 사용하기 위해서는 Manifest 파일에 권한을 설정해야 한다.
<uses-permission android:name="android.permission.READ\_PHONE\_STATE" />
<uses-permission android:name="android.permission.READ\_PHONE\_NUMBERS" />
READ_PHONE_STATE와 READ_PHONE_NUMBERS는 전화번호나 IMEI처럼 민감한 정보를 가져오기 위해 필요하다.
Android 10(Q) 이후부터는 READ_PHONE_STATE 권한을 통해 IMEI를 바로 가져올 수 없으며, 기기 정책에 따라 제한될 수 있다.
기본 USIM 정보 가져오기 구현
val telephonyManager = getSystemService(Context.TELEPHONY\_SERVICE) as TelephonyManager
// SIM 상태
val simState = telephonyManager.simState
// 전화번호
val phoneNumber = if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.READ\_PHONE\_NUMBERS
) == PackageManager.PERMISSION\_GRANTED
) {
telephonyManager.line1Number
} else {
"권한 필요"
}
// IMEI 가져오기 (Android 10 이상에서는 제한됨)
val imei = if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.READ\_PHONE\_STATE
) == PackageManager.PERMISSION\_GRANTED
) {
telephonyManager.imei ?: "정보 없음"
} else {
"권한 필요"
}
// 국가 코드 및 네트워크 정보
val simCountry = telephonyManager.simCountryIso
val networkCountry = telephonyManager.networkCountryIso
val networkOperator = telephonyManager.networkOperator
val simOperator = telephonyManager.simOperator
// 네트워크 상태 확인
val networkType = telephonyManager.networkType
val dataState = telephonyManager.dataState
Log.d("TelephonyInfo", "SIM 상태: $simState")
Log.d("TelephonyInfo", "전화번호: $phoneNumber")
Log.d("TelephonyInfo", "IMEI: $imei")
Log.d("TelephonyInfo", "SIM 국가 코드: $simCountry")
Log.d("TelephonyInfo", "네트워크 국가 코드: $networkCountry")
Log.d("TelephonyInfo", "네트워크 통신사 코드: $networkOperator")
Log.d("TelephonyInfo", "유심 통신사 코드: $simOperator")
Log.d("TelephonyInfo", "네트워크 타입: $networkType")
Log.d("TelephonyInfo", "데이터 상태: $dataState")
// 통신사 코드
// MCC(국가코드) = 450 한국
// MNC(망코드) = 08 KT, 05 SKT, 06 LGU+
TelephonyManager 사용 시 주의사항
- 안드로이드 최신 버전에서는 보안 강화를 위해 민감 정보 접근이 점점 제한되고 있다. 특히, IMEI나 전화번호는 사용자의 명시적 권한 승인이 필요하며, 정책상 일부 기기에서는 접근이 불가할 수 있다.
- 이동 중이거나 신호가 약한 환경에서는 getNetworkType() 등 네트워크 정보가 일시적으로 변경될 수 있다.
'Android' 카테고리의 다른 글
[Android] Compose Composable 함수들 - (2) (0) | 2024.11.12 |
---|---|
[Android] Compose Composable 함수들 - (1) (0) | 2024.11.11 |
[Android] API KEY 안전하게 관리하기 (Kotlin DSL) (0) | 2024.09.05 |
[Android] RecyclerView 안티 패턴 (0) | 2024.08.27 |
[Android] Compose remember 간단 요약 (0) | 2024.07.17 |