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

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

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

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

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

ประโยชน์หลักของแนวทางนี้คือ:

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

มันทำงานอย่างไร

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

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

ชุดของค่าสำหรับอุปกรณ์เฉพาะถูกกำหนดโดยการค้นหาส่วนประกอบต่อไปนี้ตามลำดับ:

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

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

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

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

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

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

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

แอปของผู้ให้บริการมาพร้อมกับค่าต่างๆ ต่อไปนี้ ทำให้สามารถตัดสินใจแบบไดนามิกได้ว่าจะส่งคืนค่าใด:

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรวม ID ผู้ให้บริการ โปรดดู การผสาน ID ผู้ให้บริการกับ CarrierConfig

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

การสร้างรายการคู่ค่าคีย์เกิดขึ้น:

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

ดูข้อมูลอ้างอิง android.service.carrier.CarrierService#onLoadConfig() สำหรับรายละเอียดเพิ่มเติม

การใช้ config

เมื่อคอนฟิกูเรชันถูกสร้างขึ้น ค่าที่อยู่ภายในจะถูกใช้เพื่อตั้งค่าต่างๆ ของคอนฟิกูเรชันระบบ ซึ่งรวมถึง:

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

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

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

การสร้างแอพ

การสร้างแอพ

แอปของคุณต้องกำหนดเป้าหมายระดับ Android 6.0 API (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

การตั้งชื่อคลาสในรายการ

ตัวอย่างอยู่ด้านล่าง:

<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