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

วิธีดึง Network Country ISO เริ่มต้นใน Android

การดึงรหัสประเทศของเครือข่าย (Network Country ISO) ใน Android

ตัวอย่างสาธิตการใช้ getNetworkCountryIso() เพื่อดึงรหัสประเทศ 2 ตัวอักษร (ISO 3166-1 alpha-2) ของเครือข่ายที่เชื่อมต่ออยู่

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

    private void fetchNetworkCountryIso() {
        // getNetworkCountryIso() คืนค่า ISO 3166-1 alpha-2 (2 ตัวอักษร)
        String countryIso = telephonyManager.getNetworkCountryIso();
        textView.setText("Network Country ISO: " + (countryIso != null ? countryIso.toUpperCase() : "ไม่พบข้อมูล"));
    }

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

การทดสอบ

รันแอป อนุญาต Permission จะแสดงรหัสประเทศ เช่น TH (Thailand), US (United States), JP (Japan)

วิธีดึง Network Country ISO เริ่มต้นใน Android

Network Country ISO vs Sim Country ISO

เมธอดคืนค่าความหมาย
getNetworkCountryIso()ISO Code (เช่น "th")ประเทศของ เครือข่ายที่เชื่อมต่ออยู่ (Current network)
getSimCountryIso()ISO Code (เช่น "th")ประเทศของ SIM Card (Home country)

ต่างกันเมื่อ Roaming: Network Country = ประเทศที่อยู่ now, Sim Country = ประเทศที่ซื้อ SIM

รายการ ISO Code ประเทศยอดนิยม

  • TH = Thailand
  • US = United States
  • JP = Japan
  • CN = China
  • KR = South Korea
  • SG = Singapore
  • MY = Malaysia
  • ID = Indonesia
  • VN = Vietnam

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

  • ตั้งค่า Region/Locale ให้ App อัตโนมัติ
  • แสดงเนื้อหา/ราคา/ภาษาตามประเทศ
  • ปฏิบัติตามกฎระเบียบท้องถิ่น (GDPR, PDPA, etc.)
  • Analytics: จัดกลุ่ม User ตามประเทศ
  • Feature Flag: เปิด/ปิด Feature ตามประเทศ

ข้อควรระวัง

  • คืนค่า null หรือ "" ถ้าไม่มี SIM หรือไม่ได้เชื่อมต่อเครือข่าย
  • คืนค่าเป็น Lowercase ("th") ควร .toUpperCase() ก่อนใช้
  • Dual SIM: ใช้ createForSubscriptionId()
  • อาจไม่แม่นยำถ้าใช้ Wi-Fi Calling (อาจคืนค่าประเทศของ Wi-Fi)

โค้ดรองรับ Dual SIM (API 22+)

SubscriptionManager subManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subs = subManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo sub : subs) {
    TelephonyManager tm = telephonyManager.createForSubscriptionId(sub.getSubscriptionId());
    String iso = tm.getNetworkCountryIso();
    Log.d(TAG, "SIM " + sub.getDisplayName() + " Country: " + iso);
}