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 เป็นแบบสาธารณะและมีการกำหนดไว้อย่างดี
มันทำงานอย่างไร
กำลังโหลดการกำหนดค่า
การกำหนดค่าผู้ให้บริการที่ได้รับจากคุณสมบัตินี้คือชุดของคู่คีย์-ค่าที่เปลี่ยนพฤติกรรมที่เกี่ยวข้องกับระบบโทรศัพท์ต่างๆ ในแพลตฟอร์ม
ชุดของค่าสำหรับอุปกรณ์เฉพาะถูกกำหนดโดยการสืบค้นส่วนประกอบต่อไปนี้ตามลำดับ:
- แอปผู้ให้บริการ (นี่เป็นทางเลือก แต่เป็นตำแหน่งที่แนะนำสำหรับการกำหนดค่าเพิ่มเติมนอกเหนือจากที่มีอยู่ใน Android Open Source Project (AOSP))
- แอปกำหนดค่าแพลตฟอร์มที่มาพร้อมกับอิมเมจระบบ
- ค่าเริ่มต้นฮาร์ดโค้ดลงในกรอบงาน (เทียบเท่ากับพฤติกรรมก่อน Android 6.0)
แอปกำหนดค่าแพลตฟอร์ม
แอปกำหนดค่าแพลตฟอร์มทั่วไปจะมาพร้อมกับอิมเมจระบบ แอปนี้สามารถระบุค่าสำหรับตัวแปรใดๆ ที่แอปผู้ให้บริการทั่วไปไม่มีได้ แอปกำหนดค่าแพลตฟอร์มสามารถพบได้ (ใน Android 6.0) ใน: packages/apps/CarrierConfig
จุดประสงค์ของแอปนี้คือเพื่อให้การกำหนดค่าตามเครือข่ายบางอย่างเมื่อไม่ได้ติดตั้งแอปของผู้ให้บริการ และผู้ให้บริการ/OEM ควรทำการเปลี่ยนแปลงเพียงเล็กน้อยในรูปภาพของตนเอง ผู้ให้บริการควรจัดเตรียมแอปผู้ให้บริการแยกต่างหากสำหรับการปรับแต่งของผู้ให้บริการ เพื่อให้สามารถเผยแพร่การอัปเดตผ่านช่องทางต่างๆ เช่น App Store
วิธีการให้สิทธิ์แก่แอปของผู้ให้บริการ
แอปของผู้ให้บริการที่เป็นปัญหาจะต้องลงนามด้วยใบรับรองเดียวกันกับที่พบในซิมการ์ด ตามที่บันทึกไว้ใน สิทธิ์ของผู้ให้บริการ UICC
ข้อมูลใดบ้างที่ส่งผ่านไปยังแอปของผู้ให้บริการ
แอปผู้ให้บริการมาพร้อมกับค่าต่อไปนี้ ทำให้สามารถตัดสินใจแบบไดนามิกว่าจะส่งคืนค่าใด:
- มช
- บรรษัทข้ามชาติ
- เอสพีเอ็น
- ไอเอ็มซี
- GID1
- GID2
- รหัสผู้ให้บริการ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรวม ID ผู้ให้บริการ โปรดดู การรวม ID ผู้ให้บริการกับ CarrierConfig
เมื่อโหลดการกำหนดค่าของผู้ให้บริการเกิดขึ้น
การสร้างรายการคู่ค่าคีย์เกิดขึ้น:
- เมื่อโหลด SIM แล้ว (บูตหรือ SIM hot swap)
- เมื่อแอปของผู้ให้บริการทริกเกอร์การโหลดซ้ำด้วยตนเอง
- เมื่อแอปผู้ให้บริการได้รับการอัพเดต
ดูข้อมูลอ้างอิง android.service.carrier.CarrierService#onLoadConfig()
สำหรับรายละเอียดเพิ่มเติม
การใช้การกำหนดค่า
เมื่อสร้างการกำหนดค่า ค่าที่อยู่ภายในจะถูกใช้เพื่อตั้งค่าต่างๆ ของการกำหนดค่าระบบ รวมถึง:
- การตั้งค่าระบบโทรศัพท์ภายในกรอบงาน
- ค่าการกำหนดค่าที่ส่งคืน 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>
การลงนามแอปด้วยใบรับรองเดียวกันบนซิม
ดู สิทธิ์ของผู้ให้บริการ UICC สำหรับข้อกำหนด
การเพิ่ม APN ด้วยแอปของผู้ให้บริการ
หากต้องการเพิ่ม APN โดยทางโปรแกรมจากแอปของผู้ให้บริการ (เช่น ระหว่างการเปิดใช้งาน SIM) ให้ใช้ ContentResolver
API เพื่อเพิ่มรายการ APN ไปยังผู้ให้บริการเนื้อหาที่ระบุโดย URI android.provider.Telephony.Carriers.CONTENT_URI
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างตารางสำหรับ URI เนื้อหา โปรดดูที่ Telephony.Carriers
สำหรับข้อมูลเพิ่มเติม โปรดดู APN และ CarrierConfig
กำลังทดสอบแอป
เมื่อคุณสร้างแอปการกำหนดค่าแล้ว คุณสามารถทดสอบโค้ดของคุณด้วย:
- ซิมที่มีลายเซ็นใบรับรองที่ถูกต้อง
- อุปกรณ์ที่ใช้ Android 6.0 ขึ้นไป เช่น อุปกรณ์ Android