Android 6.0 ขึ้นไปมีความสามารถของแอปที่ได้รับสิทธิ์ในการกำหนดค่าเฉพาะผู้ให้บริการให้กับแพลตฟอร์ม ฟังก์ชันการทำงานนี้อิงตามสิทธิ์ของผู้ให้บริการ UICC ที่เปิดตัวใน Android 5.1 (Lollipop MR1) ทำให้สามารถย้ายการกำหนดค่าของผู้ให้บริการออกจากการวางซ้อนการกำหนดค่าแบบคงที่ และช่วยให้ผู้ให้บริการและ OEM กำหนดค่าผู้ให้บริการแบบไดนามิกผ่านอินเทอร์เฟซที่กำหนดได้
แอปของผู้ให้บริการที่ลงนามอย่างถูกต้องสามารถโหลดไว้ล่วงหน้าในอิมเมจระบบ ติดตั้งโดยอัตโนมัติ หรือติดตั้งด้วยตนเองผ่าน App Store แพลตฟอร์มจะค้นหาแอปนี้เพื่อระบุการกำหนดค่าสำหรับการตั้งค่า ซึ่งได้แก่
- เครือข่ายที่โรมมิ่ง/ไม่ได้โรมมิ่ง
- ข้อความเสียงพร้อมภาพ
- การตั้งค่าเครือข่าย SMS/MMS
- การกำหนดค่า VoLTE/IMS
การกำหนดค่าที่จะแสดงขึ้นอยู่กับแอปของผู้ให้บริการโดยสมบูรณ์ และสามารถเป็นแบบไดนามิกโดยอิงตามข้อมูลที่ละเอียดซึ่งส่งไปยังแอปผ่านแพลตฟอร์ม
ประโยชน์หลักๆ ของแนวทางนี้ ได้แก่
- การกำหนดค่าแบบไดนามิก - การรองรับแนวคิดต่างๆ เช่น การกำหนดค่าที่ได้มาที่ไม่ใช่ MCCMNC เช่น ผู้ให้บริการเครือข่ายเสมือนบนอุปกรณ์เคลื่อนที่ (MVNO) หรือลูกค้าเลือกใช้บริการเพิ่มเติม
- รองรับอุปกรณ์ที่ขายผ่านช่องทางใดก็ได้ เช่น โทรศัพท์ที่ซื้อจากร้านค้าทั่วไปจะกำหนดค่าการตั้งค่าที่เหมาะสมโดยอัตโนมัติได้ด้วยการดาวน์โหลดแอปจาก App Store
- ความปลอดภัย - สิทธิ์ในการให้การกำหนดค่านี้จะมอบให้กับแอปที่ผู้ให้บริการลงนามเท่านั้น
- defined 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 ในโปรแกรมโทรศัพท์
คีย์การกำหนดค่า
รายการคีย์ได้รับการกำหนดเป็นส่วนหนึ่งของ 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>
ลงนามแอปด้วยใบรับรองเดียวกันในซิม
โปรดดูข้อกำหนดในสิทธิ์ของผู้ให้บริการ 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() |