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

วิธีตรวจสอบว่า Mobile เป็น World Phone หรือไม่ใน Android

การตรวจสอบ World Phone (Global Phone) ใน Android

ตัวอย่างสาธิตการใช้ TelephonyManager.isWorldPhone() เพื่อตรวจสอบว่าอุปกรณ์รองรับทั้ง GSM และ CDMA (ใช้งานได้ทั่วโลก) หรือไม่

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

Android Studio → File → New Project

ขั้นตอนที่ 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.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);
        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 {
            fetchWorldPhoneStatus();
        }
    }

    private void fetchWorldPhoneStatus() {
        // isWorldPhone() - คืนค่า true ถ้ารองรับทั้ง GSM และ CDMA
        boolean isWorldPhone = telephonyManager.isWorldPhone();
        String status = isWorldPhone ? "🌍 World Phone (Global)" : "📱 Single Mode Phone";

        StringBuilder sb = new StringBuilder();
        sb.append(status).append("\n\n");
        sb.append("Phone Type: ").append(getPhoneTypeName(telephonyManager.getPhoneType())).append("\n");
        sb.append("Network Type: ").append(getNetworkTypeName(telephonyManager.getNetworkType())).append("\n");

        textView.setText(sb.toString());
    }

    private String getPhoneTypeName(int type) {
        switch (type) {
            case TelephonyManager.PHONE_TYPE_GSM: return "GSM";
            case TelephonyManager.PHONE_TYPE_CDMA: return "CDMA";
            case TelephonyManager.PHONE_TYPE_SIP: return "SIP/VoIP";
            case TelephonyManager.PHONE_TYPE_NONE: return "None";
            default: return "Unknown (" + type + ")";
        }
    }

    private String getNetworkTypeName(int type) {
        switch (type) {
            case TelephonyManager.NETWORK_TYPE_GSM: return "GSM";
            case TelephonyManager.NETWORK_TYPE_CDMA: return "CDMA (IS-95)";
            case TelephonyManager.NETWORK_TYPE_EDGE: return "EDGE";
            case TelephonyManager.NETWORK_TYPE_UMTS: return "UMTS (3G)";
            case TelephonyManager.NETWORK_TYPE_HSDPA: return "HSDPA";
            case TelephonyManager.NETWORK_TYPE_HSUPA: return "HSUPA";
            case TelephonyManager.NETWORK_TYPE_HSPA: return "HSPA";
            case TelephonyManager.NETWORK_TYPE_HSPAP: return "HSPA+";
            case TelephonyManager.NETWORK_TYPE_LTE: return "LTE (4G)";
            case TelephonyManager.NETWORK_TYPE_LTE_CA: return "LTE CA";
            case TelephonyManager.NETWORK_TYPE_IWLAN: return "IWLAN";
            case TelephonyManager.NETWORK_TYPE_NR: return "NR (5G)";
            default: return "Unknown (" + type + ")";
        }
    }

    @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) {
            boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
            if (granted) fetchWorldPhoneStatus();
            else textView.setText("Permission denied");
        }
    }
}

การทดสอบ

รันแอป อนุญาต Permission จะแสดง World Phone Status พร้อม Phone Type และ Network Type

วิธีตรวจสอบว่า Mobile เป็น World Phone หรือไม่ใน Android

World Phone คืออะไร?

  • World Phone (Global Phone): อุปกรณ์ที่รองรับ ทั้ง GSM และ CDMA
  • ใช้งานได้ใน ทุกประเทศ (GSM ทั่วโลก + CDMA ในบางประเทศ เช่น US, Japan, Korea)
  • มี Radio ทั้งสองระบบ หรือ Radio แบบ Multi-mode
  • ตัวอย่าง: iPhone (รุ่นใหม่), Google Pixel, Samsung Galaxy S/Note Series (รุ่น Global)

Phone Type Classification

Phone TypeคำอธิบายisWorldPhone()
PHONE_TYPE_GSMGSM Only (ส่วนใหญ่ในเอเชีย/ยุโรป)false
PHONE_TYPE_CDMACDMA Only (Verizon, Sprint เก่า)false
PHONE_TYPE_GSM | PHONE_TYPE_CDMADual Mode (World Phone)true
PHONE_TYPE_NONEไม่มี Radio (Wi-Fi Only)false
PHONE_TYPE_SIPVoIP Onlyfalse

Network Type vs Phone Type

  • Phone Type (Hardware Capability): getPhoneType() - ระบบที่ Hardware รองรับ
  • Network Type (Current Connection): getNetworkType() - เครือข่ายที่เชื่อมต่ออยู่ตอนนี้
  • World Phone อาจเชื่อมต่อ GSM อยู่ แต่ Hardware รองรับ CDMA ด้วย

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

  • Travel Apps: แนะนำแผน Roaming/International Plan
  • Carrier Apps: ตรวจสอบความเข้ากันได้ของ SIM
  • Enterprise MDM: นโยบายอุปกรณ์สำหรับพนักงานเดินทางต่างประเทศ
  • Device Compatibility Check: ก่อนขาย SIM/Plan ให้ลูกค้า

ข้อควรระวัง

  • สมาร์ทโฟนสมัยใหม่ส่วนใหญ่เป็น World Phone แล้ว (LTE/5G รองรับทุก Band)
  • CDMA กำลังถูกเลิกใช้ (Verizon, Sprint ปิด CDMA แล้ว) → World Phone ความหมายเปลี่ยนไป
  • 5G NR (New Radio) เป็น Global Standard เดียว → แนวโน้ม World Phone จะหายไป
  • Dual SIM: ต้องตรวจสอบแต่ละ Subscription แยกกัน

โค้ดตรวจสอบแบบครบถ้วน (Modern Approach)

public String getDeviceNetworkCapability(Context context) {
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    PackageManager pm = context.getPackageManager();

    StringBuilder sb = new StringBuilder();
    sb.append("World Phone: ").append(tm.isWorldPhone()).append("\n");
    sb.append("Phone Type: ").append(tm.getPhoneType()).append("\n");
    sb.append("Network Type: ").append(tm.getNetworkType()).append("\n");
    sb.append("Data Capable: ").append(pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_DATA)).append("\n");
    sb.append("SMS Capable: ").append(tm.isSmsCapable()).append("\n");

    // 5G Support (API 29+)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        sb.append("5G Supported: ").append(is5gSupported(tm)).append("\n");
    }
    return sb.toString();
}

private boolean is5gSupported(TelephonyManager tm) {
    // ตรวจสอบจาก Network Type หรือ Hardware Features
    return tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_NR;
}