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

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

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

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

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

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

  • การกำหนดค่าแบบไดนามิก - การรองรับแนวคิดต่างๆ เช่น การกำหนดค่าที่ได้มาที่ไม่ใช่ MCCMNC เช่น ผู้ให้บริการเครือข่ายเสมือนบนอุปกรณ์เคลื่อนที่ (MVNO) หรือลูกค้าเลือกใช้บริการเพิ่มเติม
  • รองรับอุปกรณ์ที่ขายผ่านช่องทางใดก็ได้ เช่น โทรศัพท์ที่ซื้อจากร้านค้าทั่วไปจะกำหนดค่าการตั้งค่าที่เหมาะสมโดยอัตโนมัติได้ด้วยการดาวน์โหลดแอปจาก App Store
  • ความปลอดภัย - สิทธิ์ในการให้การกำหนดค่านี้จะมอบให้กับแอปที่ผู้ให้บริการลงนามเท่านั้น
  • defined 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 ในโปรแกรมโทรศัพท์

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

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

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

โปรดดูข้อกำหนดในสิทธิ์ของผู้ให้บริการ 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()