안드로이드에서 전화번호 가져오기 개요
이 튜토리얼에서는 안드로이드 앱에서 기기의 전화번호를 가져와 화면에 표시하는 방법을 단계별로 알아봅니다. 전화번호를 읽어오려면 READ_SMS, READ_PHONE_NUMBERS, READ_PHONE_STATE 세 가지 권한이 필요하며, 마시멜로(API 23) 이상 버전에서는 런타임 권한 요청 처리도 함께 구현해야 합니다.
1단계: 새 프로젝트 만들기
Android Studio를 실행하고 File ⇒ New Project 메뉴로 이동한 뒤, 프로젝트 생성에 필요한 모든 정보를 입력하여 새 프로젝트를 만듭니다.
2단계: 레이아웃 파일 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "https://schemas.android.com/apk/res/android"
xmlns:app = "https://schemas.android.com/apk/res-auto"
xmlns:tools = "https://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity">
<TextView
android:id = "@+id/phoneNumber"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "phone number"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintLeft_toLeftOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
</android.support.constraint.ConstraintLayout>
위 코드에서는 화면 정중앙에 하나의 TextView를 배치했습니다. 사용자가 앱을 실행하면 이 TextView에 기기의 전화번호가 표시됩니다.
3단계: MainActivity 코드 작성
src/MainActivity.java 파일에 아래 코드를 추가합니다.
package com.example.andy.myapplication;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import static android.Manifest.permission.READ_PHONE_NUMBERS;
import static android.Manifest.permission.READ_PHONE_STATE;
import static android.Manifest.permission.READ_SMS;
public class MainActivity extends AppCompatActivity {
TextView textView;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.phoneNumber);
if (ActivityCompat.checkSelfPermission(this, READ_SMS) == PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, READ_PHONE_NUMBERS) ==
PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
TelephonyManager tMgr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
textView.setText(mPhoneNumber);
return;
} else {
requestPermission();
}
}
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{READ_SMS, READ_PHONE_NUMBERS, READ_PHONE_STATE}, 100);
}
}
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 100:
TelephonyManager tMgr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) !=
PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return;
}
String mPhoneNumber = tMgr.getLine1Number();
textView.setText(mPhoneNumber);
break;
}
}
}
코드 동작 원리
- onCreate(): READ_SMS, READ_PHONE_NUMBERS, READ_PHONE_STATE 권한이 이미 부여되었는지 확인합니다.
- 권한이 모두 승인된 상태라면 TelephonyManager의 getLine1Number() 메서드로 전화번호를 가져와 TextView에 설정합니다.
- 권한이 없으면 requestPermission()을 호출해 런타임 권한을 요청합니다.
- onRequestPermissionsResult(): 권한 요청 결과(요청 코드 100)를 받아 처리하며, 승인되면 전화번호를 화면에 표시합니다.
앱 실행 및 결과 확인
실제 안드로이드 기기를 컴퓨터에 연결한 상태에서 Android Studio 툴바의 Run 아이콘을 클릭해 앱을 실행합니다. 디바이스 선택 창에서 자신의 모바일 기기를 고르면 아래와 같은 기본 화면이 나타납니다.

앱에 처음 진입하면 런타임 권한을 요청하는 대화상자가 표시됩니다. 모든 권한을 허용하면 위 스크린샷과 같이 기기의 전화번호가 화면에 출력됩니다.
참고 사항
일부 통신사나 기기에서는 SIM 카드에 전화번호가 저장되어 있지 않아 getLine1Number()가 빈 문자열을 반환할 수 있습니다. 이 경우 서버 측 검증이나 SMS 인증 등의 대체 방식을 함께 고려하는 것이 좋습니다.