이 튜토리얼에서는 안드로이드 앱 내부에서 코드만으로 기기의 전화번호를 가져오는 방법을 단계별로 살펴봅니다.
1단계 — 새 프로젝트 생성
Android Studio를 실행한 뒤 File ⇒ New Project 메뉴로 이동하고, 필요한 항목을 모두 입력하여 새 프로젝트를 생성합니다.
2단계 — 레이아웃 작성 (res/layout/activity_main.xml)
아래 코드를 activity_main.xml 파일에 추가합니다. 화면 중앙에 전화번호가 표시될 TextView 하나를 배치하는 간단한 구성입니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:layout_centerInParent="true"
android:textSize="24sp"
android:textStyle="bold"/>
</RelativeLayout>
3단계 — MainActivity.java 구현
TelephonyManager의 getLine1Number() 메서드를 사용해 전화번호를 조회합니다. 민감한 정보에 접근하므로 런타임 권한(READ_PHONE_STATE) 요청과 그 결과를 처리하는 로직도 함께 포함되어 있습니다.
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView textView;
private static final int REQUEST_CODE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
TelephonyManager telephonyManager = (TelephonyManager)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) {
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE);
}
textView.setText(telephonyManager.getLine1Number());
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
switch (requestCode) {
case REQUEST_CODE: {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "Permission Granted",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Permission Denied",Toast.LENGTH_SHORT).show();
}
}
}
}
}
4단계 — 매니페스트에 권한 등록 (androidManifest.xml)
전화 상태를 읽기 위해 AndroidManifest.xml에 다음과 같이 READ_PHONE_STATE 권한을 반드시 선언해야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
앱 실행하기
실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 열고 툴바의 Run 아이콘을 클릭하세요. 기기 선택 목록에서 본인의 모바일 기기를 고르면, 해당 기기 화면에 아래와 같이 기본 화면이 나타납니다.

추가 참고 사항
- 번호가 비어 있을 수 있습니다. getLine1Number()는 SIM 카드나 통신사 데이터에 번호가 저장되어 있지 않으면 null 또는 빈 문자열을 반환할 수 있습니다. 일부 통신사는 번호를 아예 제공하지 않으므로, 실서비스에서는 SMS 인증 등 대체 수단을 함께 고려하는 것이 좋습니다.
- 최신 OS 권한 주의: Android 10(API 29) 이상 환경에서는 READ_PHONE_NUMBERS 권한이 함께 필요할 수 있으며, Play 스토어 심사 시 해당 권한 사용 사유를 명확히 해야 합니다.
- AndroidX 마이그레이션 권장: 위 예제는 구버전 support library를 사용하지만, 신규 프로젝트라면 androidx.appcompat.app.AppCompatActivity 및 AndroidX 버전 ActivityCompat/ActivityCompat.requestPermissions()로 교체하는 것이 바람직합니다.