Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีดึงจำนวน SIM การ์ดในอุปกรณ์ Android

การตรวจสอบจำนวน SIM Card (Phone Count) ใน Android

ตัวอย่างสาธิตการใช้ TelephonyManager.getPhoneCount() (API 23+) เพื่อดึงจำนวน SIM Slot ที่อุปกรณ์รองรับ

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project (Min SDK 23+)

ขั้นตอนที่ 2: Layout XML (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:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

ขั้นตอนที่ 3: 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" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />

    <application ...>
        <activity android:name=".MainActivity"> ... </activity>
    </application>
</manifest>

ขั้นตอนที่ 4: โค้ด Java (src/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.M) // API 23+
    @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);
        checkPermissionAndFetch();
    }

    private void checkPermissionAndFetch() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_REQUEST_CODE);
        } else {
            fetchPhoneCount();
        }
    }

    private void fetchPhoneCount() {
        // getPhoneCount() - API 23+
        // คืนค่าจำนวน SIM slots ที่อุปกรณ์รองรับ (ไม่ใช่จำนวน SIM ที่เสียบอยู่)
        int phoneCount = telephonyManager.getPhoneCount();
        textView.setText("SIM Slots (Phone Count): " + phoneCount);

        // เพิ่มข้อมูล SIM ที่ Active อยู่ (API 22+)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            android.telephony.SubscriptionManager subManager =
                    (android.telephony.SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
            if (subManager != null) {
                int activeCount = subManager.getActiveSubscriptionInfoCount();
                textView.append("\nActive SIMs: " + activeCount);

                // รายละเอียดแต่ละ SIM
                java.util.List<android.telephony.SubscriptionInfo> subs =
                        subManager.getActiveSubscriptionInfoList();
                for (android.telephony.SubscriptionInfo sub : subs) {
                    textView.append("\n- " + sub.getDisplayName() + " (Slot " + sub.getSimSlotIndex() + ")");
                }
            }
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                fetchPhoneCount();
            } else {
                textView.setText("Permission denied");
            }
        }
    }
}

การทดสอบ

รันแอป อนุญาต Permission จะแสดงจำนวน SIM Slots และรายละเอียด SIM ที่ Active

วิธีดึงจำนวน SIM การ์ดในอุปกรณ์ Android

Phone Count vs Active SIM Count

เมธอดคืนค่าความหมาย
getPhoneCount()int (1, 2, 3...)จำนวน SIM Slots ที่ Hardware รองรับ (Physical slots)
SubscriptionManager.getActiveSubscriptionInfoCount()intจำนวน SIM ที่ Active/Inserted อยู่จริง

ตัวอย่าง: โทรศัพท์ Dual SIM (2 slots) แต่เสียบ SIM อยู่ 1 ใบ → PhoneCount=2, ActiveCount=1

ข้อมูล SubscriptionInfo ที่มีประโยชน์

SubscriptionInfo sub = ...;
sub.getDisplayName();        // ชื่อที่ User ตั้ง (เช่น "AIS", "Work")
sub.getCarrierName();        // ชื่อ Carrier
sub.getNumber();             // เบอร์โทร (ถ้ามี)
sub.getCountryIso();         // รหัสประเทศ
sub.getMcc(); sub.getMnc();  // MCC/MNC
sub.getSimSlotIndex();       // Slot index (0, 1, 2...)
sub.getSubscriptionId();     // Unique Sub ID (สำคัญสำหรับ createForSubscriptionId)
sub.getIconTint();           // สี Icon
sub.getMccString(); sub.getMncString();

กรณีการใช้งาน (Use Cases)

  • ปรับ UI ตามจำนวน SIM (Single/Dual SIM layout)
  • เลือก SIM สำหรับโทร/ส่ง SMS/ใช้ Data
  • แสดงสถานะ SIM แต่ละ Slot
  • Feature ที่ต้องการ Dual SIM (Dual Messenger, Parallel Space)

ข้อควรระวัง

  • getPhoneCount() ต้อง API 23+
  • ต้อง Permission READ_PHONE_STATE
  • บางอุปกรณ์ eSIM + Physical SIM อาจรายงาน PhoneCount = 2 แต่ Active = 1 หรือ 2
  • Android 10+ อาจจำกัดข้อมูลบางอย่าง

โค้ดรองรับทุก API Level (Compatibility)

int getPhoneCount(Context context) {
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return tm.getPhoneCount();
    } else {
        // Pre-API 23: สมมติ 1 SIM (Legacy)
        return tm.getSimState() == TelephonyManager.SIM_STATE_READY ? 1 : 0;
    }
}