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

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 Open Source Project (AOSP))
  2. แอปการกำหนดค่าแพลตฟอร์มที่มาพร้อมกับอิมเมจระบบ
  3. ค่าเริ่มต้นที่ฮาร์ดโค้ดไว้ในเฟรมเวิร์ก (เทียบเท่ากับลักษณะการทำงานก่อน Android 6.0)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

สร้างแอป

สร้างแอป

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

ประกาศคลาสที่ลบล้าง 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>

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

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

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

หากต้องการเพิ่ม APN แบบเป็นโปรแกรมจากแอปของผู้ให้บริการ (เช่น ระหว่างการเปิดใช้งานซิม) ให้ใช้ ContentResolver API เพื่อเพิ่มรายการ 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()