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

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

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

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

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

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

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

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

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

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

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

  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

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

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

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

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

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

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

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

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

รายการคีย์จะกำหนดเป็นส่วนหนึ่งของ 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>

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

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

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

หากต้องการเพิ่ม APN แบบเป็นโปรแกรมจากแอปของผู้ให้บริการ (เช่น ระหว่างการเปิดใช้งาน SIM) ให้ใช้ 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()วิธีนี้ ซึ่งจะช่วยให้นักพัฒนาแอปปรับแต่งประสบการณ์การใช้งานแอปตามความสามารถที่มีให้สำหรับการสมัครใช้บริการได้ ตัวอย่างเช่น นักพัฒนาแอปสามารถตรวจสอบได้ว่าแอปโทรศัพท์ไม่อนุญาตให้โทรหากผู้ใช้สมัครใช้บริการเฉพาะอินเทอร์เน็ต

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

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

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