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