การกำหนดค่าผู้ให้บริการ

Android 6.0 ขึ้นไปมีความสามารถสำหรับแอปที่มีสิทธิ์ ในการกำหนดค่าเฉพาะผู้ให้บริการแก่แพลตฟอร์ม ฟังก์ชันนี้ซึ่งอิงตามสิทธิ์ของผู้ให้บริการ UICC ที่เปิดตัวใน Android 5.1 (Lollipop MR1) ช่วยให้ย้ายการกำหนดค่าของผู้ให้บริการ ออกจากโอเวอร์เลย์การกำหนดค่าแบบคงที่ และช่วยให้ผู้ให้บริการ และ OEM สามารถระบุการกำหนดค่าของผู้ให้บริการแบบไดนามิกไปยัง แพลตฟอร์มผ่านอินเทอร์เฟซที่กำหนด

แอปของผู้ให้บริการที่ลงนามอย่างถูกต้องจะโหลดไว้ล่วงหน้าในอิมเมจระบบ ติดตั้งโดยอัตโนมัติ หรือติดตั้งด้วยตนเองผ่าน App Store ก็ได้ แพลตฟอร์มจะค้นหาแอป เพื่อระบุการกำหนดค่าสำหรับการตั้งค่า ซึ่งรวมถึง

  • เครือข่ายโรมมิ่ง/เครือข่ายที่ไม่ใช่โรมมิ่ง
  • ข้อความเสียงพร้อมภาพ
  • การตั้งค่าเครือข่าย SMS/MMS
  • การกำหนดค่า VoLTE/IMS

การกำหนดค่าที่จะแสดงขึ้นอยู่กับแอปของผู้ให้บริการ และอาจเป็นแบบไดนามิกโดยอิงตามข้อมูลโดยละเอียดที่ส่งไปยังแอปผ่าน แพลตฟอร์ม

ประโยชน์หลักๆ ของแนวทางนี้มีดังนี้

  • การกำหนดค่าแบบไดนามิก - รองรับแนวคิดต่างๆ เช่น การกำหนดค่าที่ไม่ได้มาจาก MCCMNC เช่น ผู้ให้บริการเครือข่ายเสมือนบนมือถือ (MVNO) หรือลูกค้าที่เลือกใช้บริการเพิ่มเติม
  • รองรับอุปกรณ์ที่ขายผ่านช่องทางใดก็ตาม - ตัวอย่างเช่น คุณสามารถกำหนดค่าโทรศัพท์ที่ซื้อจากตลาดเปิดโดยอัตโนมัติด้วยการตั้งค่าที่เหมาะสมได้โดยการดาวน์โหลดแอปจาก App Store
  • ความปลอดภัย - สิทธิ์ในการกำหนดค่านี้ จะมอบให้เฉพาะแอปที่ผู้ให้บริการลงนามเท่านั้น
  • API ที่กำหนด - ก่อนหน้านี้การกำหนดค่านี้จะจัดเก็บ ไว้ในส่วนซ้อนทับ XML ภายในเฟรมเวิร์กเป็นส่วนใหญ่ และไม่ได้จัดเก็บผ่าน API สาธารณะ API การกำหนดค่าของผู้ให้บริการใน Android 6.0 เป็นแบบสาธารณะและมีการกำหนดไว้อย่างชัดเจน

วิธีการทำงาน

โหลดการกำหนดค่า

การกำหนดค่าของผู้ให้บริการที่ฟีเจอร์นี้ระบุคือชุดคู่คีย์-ค่า ซึ่งเปลี่ยนลักษณะการทำงานต่างๆ ที่เกี่ยวข้องกับการโทรในแพลตฟอร์ม

ระบบจะกำหนดชุดค่าสำหรับอุปกรณ์หนึ่งๆ โดยการค้นหาคอมโพเนนต์ต่อไปนี้ตามลำดับ

  1. แอปของผู้ให้บริการ (ไม่บังคับ แต่เป็นตำแหน่งที่แนะนำ สำหรับการกำหนดค่าเพิ่มเติมนอกเหนือจากที่มีอยู่ในโครงการโอเพนซอร์ส Android (AOSP))
  2. แอปกำหนดค่าแพลตฟอร์มที่มาพร้อมกับอิมเมจระบบ
  3. ค่าเริ่มต้นที่ฮาร์ดโค้ดลงในเฟรมเวิร์ก (เทียบเท่ากับลักษณะการทำงานก่อน Android 6.0)

แอปกำหนดค่าแพลตฟอร์ม

แอปกำหนดค่าแพลตฟอร์มทั่วไปจะมาพร้อมกับอิมเมจระบบ แอปนี้สามารถระบุค่าสำหรับตัวแปรที่แอปผู้ให้บริการปกติไม่มี คุณจะดูการกำหนดค่าแพลตฟอร์ม แอปได้ (ใน Android 6.0) ที่ packages/apps/CarrierConfig

วัตถุประสงค์ของแอปนี้คือการให้การกำหนดค่าต่อเครือข่ายบางอย่างเมื่อไม่ได้ติดตั้งแอปของผู้ให้บริการ และผู้ให้บริการ/OEM ควรทำการเปลี่ยนแปลงแอปนี้ให้น้อยที่สุดในรูปภาพของตนเอง แต่ผู้ให้บริการควรจัดเตรียมแอปของผู้ให้บริการแยกต่างหาก สำหรับการปรับแต่งของผู้ให้บริการ เพื่อให้สามารถเผยแพร่การอัปเดตผ่านช่องทางต่างๆ เช่น App Store

วิธีให้สิทธิ์แก่แอปของผู้ให้บริการ

แอปของผู้ให้บริการที่เกี่ยวข้องต้องได้รับการลงนามด้วยใบรับรองเดียวกันกับที่อยู่ใน ซิมการ์ด ตามที่ระบุไว้ในสิทธิ์ของผู้ให้บริการ UICC

ข้อมูลที่ส่งไปยังแอปของผู้ให้บริการ

แอปของผู้ให้บริการจะได้รับค่าต่อไปนี้ ซึ่งช่วยให้แอปสามารถตัดสินใจแบบไดนามิกว่าจะแสดงค่าใด

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • รหัสผู้ให้บริการ

ดูข้อมูลเพิ่มเติมเกี่ยวกับการผสานรวมรหัสผู้ให้บริการขนส่งได้ที่ การผสานรวมรหัสผู้ให้บริการขนส่งกับ CarrierConfig

เมื่อเกิดการโหลดการกำหนดค่าของผู้ให้บริการ

การสร้างรายการคู่คีย์-ค่าจะเกิดขึ้นในกรณีต่อไปนี้

  • เมื่อโหลดซิม (บูตหรือสับเปลี่ยนซิมขณะเครื่องเปิด)
  • เมื่อแอปของผู้ให้บริการเรียกการโหลดซ้ำด้วยตนเอง
  • เมื่อมีการอัปเดตแอปของผู้ให้บริการ

ดูรายละเอียดเพิ่มเติมได้ที่ข้อมูลอ้างอิง android.service.carrier.CarrierService#onLoadConfig()

ใช้การกำหนดค่า

เมื่อสร้างการกำหนดค่าแล้ว ระบบจะใช้ค่าที่อยู่ในการกำหนดค่า เพื่อตั้งค่าต่างๆ ของการกำหนดค่าระบบ ซึ่งรวมถึง

  • การตั้งค่าโทรศัพท์ของเฟรมเวิร์กภายใน
  • ค่าการกำหนดค่าที่ SDK ส่งคืน เช่น ใน SmsManager
  • การตั้งค่าแอป เช่น ค่าการเชื่อมต่อ VVM ใน Dialer

คีย์การกำหนดค่า

ระบบจะกำหนดรายการคีย์เป็นส่วนหนึ่งของ SDK สาธารณะใน android.telephony.CarrierConfigManager และไม่สามารถเปลี่ยนแปลงภายใน API ระดับเดียวกันได้ ดูสรุปคีย์ได้ในตารางด้านล่าง

สร้างแอป

สร้างแอป

แอปของคุณต้องกำหนดเป้าหมายเป็น API ระดับ 23 ของ Android 6.0

ประกาศคลาสที่ลบล้าง android.service.carrier.CarrierService

  1. ลบล้าง onLoadConfig เพื่อแสดงค่าที่คุณต้องการ ระบุตามออบเจ็กต์ service.carrier.CarrierIdentifier ที่ส่ง
  2. เพิ่มตรรกะเพื่อเรียกใช้ notifyConfigChangedForSubId ในสถานการณ์ ที่การกำหนดค่าของผู้ให้บริการอาจเปลี่ยนแปลงไปตามกาลเวลา (เช่น เมื่อ ผู้ใช้เพิ่มบริการพิเศษลงในบัญชี)

ตัวอย่างมีดังนี้

public class SampleCarrierConfigService extends CarrierService {

    private static final String TAG = "SampleCarrierConfigService";

    public SampleCarrierConfigService() {
        Log.d(TAG, "Service created");
    }

    @Override
    public PersistableBundle onLoadConfig(CarrierIdentifier id) {
        Log.d(TAG, "Config being fetched");
        PersistableBundle config = new PersistableBundle();
        config.putBoolean(
            CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true);
        config.putBoolean(
            CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
        config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6);
        // Check CarrierIdentifier and add more config if needed
        return config;
    }
}

ดูรายละเอียดเพิ่มเติมได้ที่ข้อมูลอ้างอิง android.service.carrier.CarrierService

ตั้งชื่อคลาสในไฟล์ Manifest

ตัวอย่างมีดังนี้

<service android:name=".SampleCarrierConfigService"
android:label="@string/service_name"
android:permission="android.permission.BIND_CARRIER_SERVICES">
      <intent-filter>
      <action android:name="android.service.carrier.CarrierService"/></intent-filter>
</service>

ลงชื่อแอปด้วยใบรับรองเดียวกันใน SIM

ดูข้อกำหนดได้ที่สิทธิ์ของผู้ให้บริการ UICC

เพิ่ม APN ด้วยแอปของผู้ให้บริการ

หากต้องการเพิ่ม APN แบบเป็นโปรแกรมจากแอปของผู้ให้บริการ (เช่น ระหว่างการเปิดใช้งานซิม การ์ด) ให้ใช้ API ContentResolver เพื่อเพิ่มรายการ APN ลงในผู้ให้บริการเนื้อหา ที่ระบุโดย URI android.provider.Telephony.Carriers.CONTENT_URI ดูข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างตารางสำหรับ URI ของเนื้อหาได้ที่ Telephony.Carriers

ดูข้อมูลเพิ่มเติมได้ที่ APN และ CarrierConfig

ทดสอบแอป

เมื่อสร้างแอปการกำหนดค่าแล้ว คุณจะทดสอบโค้ดได้โดยใช้

  • ซิมที่มีลายเซ็นใบรับรองที่ถูกต้อง
  • อุปกรณ์ที่ใช้ Android 6.0 ขึ้นไป เช่น อุปกรณ์ Android

ตั้งค่าความสามารถของบริการของผู้ให้บริการ

ใน Android ความสามารถของบริการของผู้ให้บริการจะอธิบายว่าอุปกรณ์รองรับบริการเสียง การรับส่งข้อความ และบริการข้อมูลหรือไม่ ผู้ให้บริการเครือข่ายสามารถระบุความสามารถของบริการของผู้ให้บริการเครือข่าย สำหรับอุปกรณ์ได้ที่ระดับอุปกรณ์และระดับการสมัครใช้บริการ (Android 15 ขึ้นไป)

ความสามารถของบริการระดับอุปกรณ์

ความสามารถของบริการระดับอุปกรณ์จะได้รับการกำหนดค่าเมื่อมีการผลิตอุปกรณ์ (เปลี่ยนแปลงไม่ได้หลังจากการผลิต) ผู้ให้บริการสามารถ ระบุความสามารถระดับอุปกรณ์ผ่านการลบล้างทรัพยากรระบบต่อไปนี้ ได้

แอปสามารถค้นหาความสามารถของบริการระดับอุปกรณ์ผ่าน API ต่อไปนี้ได้

ความสามารถของบริการระดับการสมัครใช้บริการ

สำหรับอุปกรณ์ที่ใช้ Android 15 ขึ้นไป ผู้ให้บริการเครือข่ายสามารถระบุ ความสามารถของบริการในอุปกรณ์ที่ระดับการสมัครใช้บริการได้ หากต้องการระบุความสามารถของบริการระดับการสมัครใช้บริการ ให้ใช้ CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY API เช่น หากต้องการระบุว่าการสมัครใช้บริการเป็นแบบข้อมูลเท่านั้น ให้ตั้งค่าเป็น SubscriptionManager#SERVICE_CAPABILITY_DATA

แอป (แอปของระบบที่โหลดไว้ล่วงหน้าและแอปของบุคคลที่สาม) สามารถค้นหาความสามารถของบริการของผู้ให้บริการสำหรับแพ็กเกจที่ระบุผ่านเมธอด SubscriptionInfo.getServiceCapabilities() ได้ ซึ่งช่วยให้นักพัฒนาแอปปรับแต่งประสบการณ์การใช้งานแอปของผู้ใช้ตาม ความสามารถที่มีอยู่สำหรับการสมัครใช้บริการได้ ตัวอย่างเช่น นักพัฒนาแอปสามารถ ตรวจสอบว่าแอปโทรศัพท์ไม่อนุญาตให้โทรออกหากผู้ใช้สมัครใช้บริการ แบบใช้ได้เฉพาะข้อมูล

API ความสามารถของบริการที่เลิกใช้งานแล้ว

ตั้งแต่ Android 15 เป็นต้นไป Android จะมีทั้งความสามารถของบริการระดับอุปกรณ์และระดับการสมัครใช้บริการ การเปลี่ยนแปลงนี้ทำให้เราเปลี่ยนชื่อ API ความสามารถระดับอุปกรณ์ที่มีอยู่เพื่อให้สามารถอ่านได้ง่ายขึ้น ตารางต่อไปนี้แสดง API ที่เลิกใช้งานแล้วและ API ที่เปลี่ยนชื่อซึ่งเปิดตัวใน Android 15

เลิกใช้งานแล้ว (Android 14 หรือต่ำกว่า) เทียบเท่า (Android 15 ขึ้นไป)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()