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 เป็นแบบสาธารณะและกำหนดไว้อย่างดี
มันทำงานอย่างไร
กำลังโหลดการกำหนดค่า
การกำหนดค่าผู้ให้บริการที่จัดหาโดยคุณสมบัตินี้คือชุดของคู่คีย์-ค่าที่เปลี่ยนพฤติกรรมที่เกี่ยวข้องกับโทรศัพท์ต่างๆ ในแพลตฟอร์ม
ชุดของค่าสำหรับอุปกรณ์เฉพาะถูกกำหนดโดยการค้นหาส่วนประกอบต่อไปนี้ตามลำดับ:
- แอปผู้ให้บริการ (เป็นทางเลือก แต่เป็นตำแหน่งที่แนะนำสำหรับการกำหนดค่าเพิ่มเติมนอกเหนือจากที่มีอยู่ในโครงการโอเพ่นซอร์ส Android (AOSP))
- แอพกำหนดค่าแพลตฟอร์มที่มาพร้อมกับอิมเมจระบบ
- ค่าเริ่มต้น ฮาร์ดโค้ดลงในเฟรมเวิร์ก (เทียบเท่ากับการทำงานก่อน 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
- แทนที่
onLoadConfig
เพื่อคืนค่าที่คุณต้องการจัดหาตามอ็อบเจ็กต์service.carrier.CarrierIdentifier
ที่ส่งผ่าน - เพิ่มตรรกะเพื่อเรียก
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