Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách lấy số điện thoại thiết bị trong Android

Mục tiêu

Lấy số điện thoại của thiết bị (SIM) và hiển thị lên TextView. Yêu cầu cấp quyền runtime (Android 6.0+).

Lưu ý quan trọng

  • Từ Android 10 (API 29), getLine1Number() thường trả về rỗng do chính sách quyền riêng tư
  • Cần quyền READ_PHONE_STATE (API < 29) hoặc READ_PHONE_NUMBERS (API 29+)
  • Nhiều thiết bị/nhà mạng không lưu số điện thoại trên SIM → kết quả có thể null

Các bước thực hiện

Bước 1: Tạo dự án mới

Android Studio → File → New Project → Empty Activity.

Bước 2: Khai báo quyền trong AndroidManifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<!-- READ_SMS không cần thiết cho getLine1Number() -->

Bước 3: Layout (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tvPhoneNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Đang tải số điện thoại..."
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Bước 4: Code MainActivity.java (xử lý runtime permission)

package com.example.getphonenumber;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 100;
    private TextView tvPhoneNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvPhoneNumber = findViewById(R.id.tvPhoneNumber);
        checkAndRequestPermission();
    }

    private void checkAndRequestPermission() {
        String[] permissions;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            permissions = new String[]{
                Manifest.permission.READ_PHONE_NUMBERS,
                Manifest.permission.READ_PHONE_STATE
            };
        } else {
            permissions = new String[]{Manifest.permission.READ_PHONE_STATE};
        }

        boolean allGranted = true;
        for (String perm : permissions) {
            if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) {
                allGranted = false;
                break;
            }
        }

        if (allGranted) {
            fetchPhoneNumber();
        } else {
            ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            boolean allGranted = true;
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    allGranted = false;
                    break;
                }
            }
            if (allGranted) {
                fetchPhoneNumber();
            } else {
                tvPhoneNumber.setText("❌ Cần cấp quyền READ_PHONE_STATE để lấy số điện thoại");
            }
        }
    }

    private void fetchPhoneNumber() {
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) 
                == PackageManager.PERMISSION_GRANTED) {
            
            String phoneNumber = telephonyManager.getLine1Number();
            
            if (phoneNumber != null && !phoneNumber.isEmpty()) {
                tvPhoneNumber.setText("📞 Số điện thoại: " + phoneNumber);
            } else {
                tvPhoneNumber.setText("⚠️ Không thể lấy số điện thoại\n(Thiết bị/Nhà mạng không hỗ trợ hoặc SIM không lưu số)");
            }
        }
    }
}

Kết quả

App yêu cầu cấp quyền khi chạy lần đầu. Sau khi cho phép, hiển thị số điện thoại hoặc thông báo không lấy được.

Cách lấy số điện thoại thiết bị trong Android

Tham khảo thêm

  • TelephonyManager.getSubscriberId() - lấy IMSI (cần quyền READ_PHONE_STATE)
  • TelephonyManager.getSimSerialNumber() - lấy ICCID
  • Để lấy danh bạ: dùng ContactsContract với quyền READ_CONTACTS