Lấy Subscriber ID (IMSI) trong Android
Hướng dẫn lấy International Mobile Subscriber Identity (IMSI) - mã định danh thuê bao duy nhất trên thẻ SIM. Yêu cầu quyền READ_PHONE_STATE.
Bước 1: Tạo dự án mới
Android Studio → File → New Project.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Bước 3: Code logic (java/MainActivity.java)
package com.example.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.NonNull;
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;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 100;
TextView textView;
TelephonyManager telephonyManager;
@RequiresApi(api = Build.VERSION_CODES.P)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (!hasPhonePermissions()) {
requestPhonePermissions();
} else {
showSubscriberId();
}
}
private boolean hasPhonePermissions() {
return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
}
private void requestPhonePermissions() {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
PERMISSION_REQUEST_CODE);
}
private void showSubscriberId() {
String subscriberId = telephonyManager.getSubscriberId(); // IMSI
textView.setText("Subscriber ID (IMSI): " + subscriberId);
}
@RequiresApi(api = Build.VERSION_CODES.P)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
if (hasPhonePermissions()) {
showSubscriberId();
} else {
textView.setText("Cần cấp quyền READ_PHONE_STATE");
}
}
}
}
Bước 4: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application ...>
<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>
Về IMSI (Subscriber ID)
- Độ dài: 15 chữ số (thường).
- Cấu trúc: MCC (3) + MNC (2-3) + MSIN (9-10).
- Duy nhất cho mỗi thuê bao SIM.
- Khác với IMEI (định danh thiết bị).
⚠️ Quan trọng: Quyền riêng tư & Android 10+
Từ Android 10 (API 29), getSubscriberId() trả về null hoặc giá trị reset cho ứng dụng không phải system app / carrier app. Google hạn chế truy cập định danh vĩnh viễn để bảo vệ quyền riêng tư người dùng. Hãy cân nhắc dùng Firebase Installation ID, Advertising ID, hoặc Instance ID thay thế.
Chạy ứng dụng
Cấp quyền → TextView hiển thị IMSI (nếu Android < 10 và có SIM).
