• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94

한 우물만 파는 기술 블로그

Android

[Android] TelephonyManager를 통해 USIM 데이터 추출하기

2024. 10. 31. 10:08

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
    'Android' 카테고리의 다른 글
    • [Android] Compose Composable 함수들 - (2)
    • [Android] Compose Composable 함수들 - (1)
    • [Android] API KEY 안전하게 관리하기 (Kotlin DSL)
    • [Android] RecyclerView 안티 패턴
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바