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 Open Source Project (AOSP))
- แอปการกำหนดค่าแพลตฟอร์มที่มาพร้อมกับอิมเมจระบบ
- ค่าเริ่มต้นที่ฮาร์ดโค้ดไว้ในเฟรมเวิร์ก (เทียบเท่ากับลักษณะการทำงานก่อน Android 6.0)
แอปการกำหนดค่าแพลตฟอร์ม
แอปการกำหนดค่าแพลตฟอร์มทั่วไปจะมาพร้อมกับอิมเมจระบบ แอปนี้สามารถแสดงผลค่าสำหรับตัวแปรใดๆ ที่แอปของผู้ให้บริการทั่วไปไม่สามารถแสดงผลได้ คุณจะพบแอปการกำหนดค่าแพลตฟอร์ม (ใน Android 6.0) ได้ที่ packages/apps/CarrierConfig
จุดประสงค์ของแอปนี้คือการกำหนดค่าต่อเครือข่ายเมื่อไม่ได้ติดตั้งแอปของผู้ให้บริการ และผู้ให้บริการ/OEM ควรทำการเปลี่ยนแปลงแอปนี้ในอิมเมจของตนเองให้น้อยที่สุด แต่ผู้ให้บริการควรจัดหาแอปของผู้ให้บริการแยกต่างหากสำหรับการปรับแต่งของผู้ให้บริการ ซึ่งจะช่วยให้เผยแพร่การอัปเดตผ่านช่องทางต่างๆ เช่น App Store ได้
วิธีให้สิทธิ์แก่แอปของผู้ให้บริการ
แอปของผู้ให้บริการที่กล่าวถึงต้องลงชื่อด้วยใบรับรองเดียวกันกับที่พบใน ซิมการ์ดตามที่ระบุไว้ใน สิทธิ์ของผู้ให้บริการ UICC
ข้อมูลที่ส่งไปยังแอปของผู้ให้บริการ
แอปของผู้ให้บริการจะได้รับค่าต่อไปนี้ ซึ่งช่วยให้แอปตัดสินใจแบบไดนามิกได้ว่าจะแสดงผลค่าใด
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- รหัสผู้ให้บริการ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการผสานรวมรหัสผู้ให้บริการได้ที่ Integrating carrier IDs with CarrierConfig
เวลาที่โหลดการกำหนดค่าของผู้ให้บริการ
การสร้างรายการคู่คีย์-ค่าจะเกิดขึ้นในกรณีต่อไปนี้
- เมื่อโหลดซิม (บูตหรือสับเปลี่ยนซิมขณะทำงาน)
- เมื่อแอปของผู้ให้บริการทริกเกอร์การโหลดซ้ำด้วยตนเอง
- เมื่อแอปของผู้ให้บริการได้รับการอัปเดต
ดูรายละเอียดเพิ่มเติมได้ที่ข้อมูลอ้างอิง
android.service.carrier.CarrierService#onLoadConfig()
ใช้การกำหนดค่า
เมื่อสร้างการกำหนดค่าแล้ว ระบบจะใช้ค่าที่อยู่ในนั้นเพื่อตั้งค่าต่างๆ ของการกำหนดค่าระบบ ซึ่งรวมถึง
- การตั้งค่าการโทรภายในเฟรมเวิร์ก
- ค่าการกำหนดค่าที่ SDK แสดงผล เช่น ใน SmsManager
- การตั้งค่าแอป เช่น ค่าการเชื่อมต่อ VVM ใน Dialer
คีย์การกำหนดค่า
รายการคีย์จะกำหนดไว้เป็นส่วนหนึ่งของ SDK สาธารณะใน android.telephony.CarrierConfigManager
และจะเปลี่ยนแปลงไม่ได้ภายในระดับ API เดียวกัน ดูสรุปคีย์ได้ในตารางด้านล่าง
สร้างแอป
สร้างแอป
แอปของคุณต้องกำหนดเป้าหมายระดับ API ของ Android 6.0 (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
ข้อมูลอ้างอิง
ตั้งชื่อคลาสในไฟล์ 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 แบบเป็นโปรแกรมจากแอปของผู้ให้บริการ (เช่น ระหว่างการเปิดใช้งานซิม)
ให้ใช้
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()
ซึ่งช่วยให้นักพัฒนาแอปปรับแต่งประสบการณ์การใช้งานแอปของผู้ใช้ตามความสามารถที่พร้อมใช้งานสำหรับการสมัครใช้บริการได้ เช่น นักพัฒนาแอปสามารถตรวจสอบว่าแอปโทรศัพท์ไม่อนุญาตให้โทรออกหากผู้ใช้ใช้การสมัครใช้บริการแบบข้อมูลเท่านั้น
API ความสามารถของบริการที่เลิกใช้งานแล้ว
ตั้งแต่ Android 15 เป็นต้นไป Android จะมีความสามารถของบริการทั้งระดับอุปกรณ์และระดับการสมัครใช้บริการ เนื่องจากการเปลี่ยนแปลงนี้ ระบบจึงเปลี่ยนชื่อ API ความสามารถระดับอุปกรณ์ที่มีอยู่เพื่อให้เข้าใจได้ง่ายขึ้น ตารางต่อไปนี้แสดง API ที่เลิกใช้งานแล้วและ API ที่เปลี่ยนชื่อซึ่งเปิดตัวใน Android 15
| เลิกใช้งานแล้ว (Android 14 หรือต่ำกว่า) | เทียบเท่า (Android 15 ขึ้นไป) |
|---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |