Android 6.0 ขึ้นไปมีความสามารถสำหรับแอปที่มีสิทธิ์ ในการกำหนดค่าเฉพาะผู้ให้บริการแก่แพลตฟอร์ม ฟังก์ชันนี้ซึ่งอิงตามสิทธิ์ของผู้ให้บริการ UICC ที่เปิดตัวใน Android 5.1 (Lollipop MR1) ช่วยให้ย้ายการกำหนดค่าของผู้ให้บริการ ออกจากโอเวอร์เลย์การกำหนดค่าแบบคงที่ และช่วยให้ผู้ให้บริการ และ OEM สามารถระบุการกำหนดค่าของผู้ให้บริการแบบไดนามิกไปยัง แพลตฟอร์มผ่านอินเทอร์เฟซที่กำหนด
แอปของผู้ให้บริการที่ลงนามอย่างถูกต้องจะโหลดไว้ล่วงหน้าในอิมเมจระบบ ติดตั้งโดยอัตโนมัติ หรือติดตั้งด้วยตนเองผ่าน App Store ก็ได้ แพลตฟอร์มจะค้นหาแอป เพื่อระบุการกำหนดค่าสำหรับการตั้งค่า ซึ่งรวมถึง
- เครือข่ายโรมมิ่ง/เครือข่ายที่ไม่ใช่โรมมิ่ง
- ข้อความเสียงพร้อมภาพ
- การตั้งค่าเครือข่าย SMS/MMS
- การกำหนดค่า VoLTE/IMS
การกำหนดค่าที่จะแสดงขึ้นอยู่กับแอปของผู้ให้บริการ และอาจเป็นแบบไดนามิกโดยอิงตามข้อมูลโดยละเอียดที่ส่งไปยังแอปผ่าน แพลตฟอร์ม
ประโยชน์หลักๆ ของแนวทางนี้มีดังนี้
- การกำหนดค่าแบบไดนามิก - รองรับแนวคิดต่างๆ เช่น การกำหนดค่าที่ไม่ได้มาจาก MCCMNC เช่น ผู้ให้บริการเครือข่ายเสมือนบนมือถือ (MVNO) หรือลูกค้าที่เลือกใช้บริการเพิ่มเติม
- รองรับอุปกรณ์ที่ขายผ่านช่องทางใดก็ตาม - ตัวอย่างเช่น คุณสามารถกำหนดค่าโทรศัพท์ที่ซื้อจากตลาดเปิดโดยอัตโนมัติด้วยการตั้งค่าที่เหมาะสมได้โดยการดาวน์โหลดแอปจาก App Store
- ความปลอดภัย - สิทธิ์ในการกำหนดค่านี้ จะมอบให้เฉพาะแอปที่ผู้ให้บริการลงนามเท่านั้น
- API ที่กำหนด - ก่อนหน้านี้การกำหนดค่านี้จะจัดเก็บ ไว้ในส่วนซ้อนทับ XML ภายในเฟรมเวิร์กเป็นส่วนใหญ่ และไม่ได้จัดเก็บผ่าน API สาธารณะ API การกำหนดค่าของผู้ให้บริการใน Android 6.0 เป็นแบบสาธารณะและมีการกำหนดไว้อย่างชัดเจน
วิธีการทำงาน
โหลดการกำหนดค่า
การกำหนดค่าของผู้ให้บริการที่ฟีเจอร์นี้ระบุคือชุดคู่คีย์-ค่า ซึ่งเปลี่ยนลักษณะการทำงานต่างๆ ที่เกี่ยวข้องกับการโทรในแพลตฟอร์ม
ระบบจะกำหนดชุดค่าสำหรับอุปกรณ์หนึ่งๆ โดยการค้นหาคอมโพเนนต์ต่อไปนี้ตามลำดับ
- แอปของผู้ให้บริการ (ไม่บังคับ แต่เป็นตำแหน่งที่แนะนำ สำหรับการกำหนดค่าเพิ่มเติมนอกเหนือจากที่มีอยู่ในโครงการโอเพนซอร์ส Android (AOSP))
- แอปกำหนดค่าแพลตฟอร์มที่มาพร้อมกับอิมเมจระบบ
- ค่าเริ่มต้นที่ฮาร์ดโค้ดลงในเฟรมเวิร์ก (เทียบเท่ากับลักษณะการทำงานก่อน 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 ใน Dialer
คีย์การกำหนดค่า
ระบบจะกำหนดรายการคีย์เป็นส่วนหนึ่งของ SDK สาธารณะใน android.telephony.CarrierConfigManager
และไม่สามารถเปลี่ยนแปลงภายใน API ระดับเดียวกันได้ ดูสรุปคีย์ได้ในตารางด้านล่าง
สร้างแอป
สร้างแอป
แอปของคุณต้องกำหนดเป้าหมายเป็น API ระดับ 23 ของ Android 6.0
ประกาศคลาสที่ลบล้าง 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
ตั้งชื่อคลาสในไฟล์ 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 แบบเป็นโปรแกรมจากแอปของผู้ให้บริการ (เช่น ระหว่างการเปิดใช้งานซิม
การ์ด) ให้ใช้ API
ContentResolver
เพื่อเพิ่มรายการ 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()
ได้ ซึ่งช่วยให้นักพัฒนาแอปปรับแต่งประสบการณ์การใช้งานแอปของผู้ใช้ตาม
ความสามารถที่มีอยู่สำหรับการสมัครใช้บริการได้ ตัวอย่างเช่น นักพัฒนาแอปสามารถ
ตรวจสอบว่าแอปโทรศัพท์ไม่อนุญาตให้โทรออกหากผู้ใช้สมัครใช้บริการ
แบบใช้ได้เฉพาะข้อมูล
API ความสามารถของบริการที่เลิกใช้งานแล้ว
ตั้งแต่ Android 15 เป็นต้นไป Android จะมีทั้งความสามารถของบริการระดับอุปกรณ์และระดับการสมัครใช้บริการ การเปลี่ยนแปลงนี้ทำให้เราเปลี่ยนชื่อ API ความสามารถระดับอุปกรณ์ที่มีอยู่เพื่อให้สามารถอ่านได้ง่ายขึ้น ตารางต่อไปนี้แสดง API ที่เลิกใช้งานแล้วและ API ที่เปลี่ยนชื่อซึ่งเปิดตัวใน Android 15
เลิกใช้งานแล้ว (Android 14 หรือต่ำกว่า) | เทียบเท่า (Android 15 ขึ้นไป) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |