Android 9 เปิดตัวอินเทอร์เฟซ SystemApi ที่เรียกว่า ImsService เพื่อช่วยคุณติดตั้งใช้งาน IP Multimedia Subsystem (IMS) ImsService API เป็นอินเทอร์เฟซที่กําหนดไว้อย่างชัดเจนระหว่างแพลตฟอร์ม Android กับการใช้งาน IMS ที่ผู้ให้บริการหรือผู้ให้บริการเครือข่ายให้
รูปที่ 1 ภาพรวมของ ImsService
การใช้อินเทอร์เฟซ ImsService ช่วยให้ผู้ติดตั้งใช้งาน IMS สามารถระบุข้อมูลการส่งสัญญาณที่สำคัญให้กับแพลตฟอร์มได้ เช่น ข้อมูลการลงทะเบียน IMS, การผสานรวม SMS ผ่าน IMS และการผสานรวมฟีเจอร์ MmTel เพื่อให้บริการโทรด้วยเสียงและวิดีโอ ImsService API เป็น API ของระบบ Android ด้วย ซึ่งหมายความว่าสามารถสร้างขึ้นจาก Android SDK ได้โดยตรงแทนที่จะสร้างจากแหล่งที่มา นอกจากนี้ คุณยังกำหนดค่าแอป IMS ที่ติดตั้งไว้ล่วงหน้าในอุปกรณ์ให้อัปเดตได้ใน Play Store
ตัวอย่างและแหล่งที่มา
Android มีแอปใน AOSP ที่ใช้ ImsService API บางส่วนเพื่อวัตถุประสงค์ในการทดสอบและการพัฒนา คุณดูแอปได้ที่ /testapps/ImsTestService
คุณดูเอกสารประกอบสําหรับ ImsService API ได้ในส่วน ImsService และคลาสอื่นๆ ใน API
การใช้งาน
ImsService API เป็น API ระดับสูงที่ช่วยให้คุณใช้ IMS ได้หลายวิธี โดยขึ้นอยู่กับฮาร์ดแวร์ที่มี ตัวอย่างเช่น การเปลี่ยนแปลงการติดตั้งใช้งานจะขึ้นอยู่กับว่าการติดตั้งใช้งาน IMS อยู่ในโปรเซสเซอร์แอปทั้งหมด หรือมีการส่งผ่านไปยังโมเด็มบางส่วนหรือทั้งหมด Android ไม่ได้จัดหา HAL สาธารณะสำหรับการส่งออกไปยังตัวประมวลผลย่านความถี่ต่ำ ดังนั้นการส่งออกจึงต้องดำเนินการโดยใช้ส่วนขยาย HAL ไปยังโมเด็ม
ใช้งานร่วมกับการติดตั้งใช้งาน IMS เวอร์ชันเก่าได้
แม้ว่า Android 9 จะมี ImsService API แต่อุปกรณ์ที่ใช้การติดตั้งใช้งาน IMS เวอร์ชันเก่าจะไม่รองรับ API นี้
สำหรับอุปกรณ์เหล่านี้ อินเทอร์เฟซ AIDL และคลาส Wrapper รุ่นเก่าได้ย้ายไปอยู่ในเนมสเปซ android.telephony.ims.compat
แล้ว เมื่ออัปเกรดเป็น Android 9 อุปกรณ์รุ่นเก่าจะต้องดำเนินการต่อไปนี้เพื่อรองรับ API เวอร์ชันเก่าต่อไป
- เปลี่ยนเนมสเปซของการติดตั้งใช้งาน ImsService ให้ขยายมาจาก API เนมสเปซ
android.telephony.ims.compat
- แก้ไขการกําหนดบริการ ImsService ใน AndroidManifest.xml เพื่อใช้การดําเนินการ
android.telephony.ims.compat.ImsService
intent-filter แทนการดําเนินการandroid.telephony.ims.ImsService
จากนั้นเฟรมเวิร์กจะเชื่อมโยงกับ ImsService โดยใช้เลเยอร์ความเข้ากันได้ที่มีให้ใน Android 9 เพื่อทํางานร่วมกับการใช้งาน ImsService
แบบเดิม
การลงทะเบียน ImsService กับเฟรมเวิร์ก
ImsService API ติดตั้งใช้งานเป็นบริการที่เฟรมเวิร์ก Android จะเชื่อมโยงด้วยเพื่อสื่อสารกับการติดตั้งใช้งาน IMS คุณต้องทำตาม 3 ขั้นตอนเพื่อลงทะเบียนแอปที่ใช้ ImsService กับเฟรมเวิร์ก ประการแรก การติดตั้งใช้งาน ImsService ต้องลงทะเบียนกับแพลตฟอร์มโดยใช้ AndroidManifest.xml
ของแอป ประการที่ 2 ต้องกำหนดว่าการติดตั้งใช้งานรองรับฟีเจอร์ IMS ใด (MmTel หรือ RCS) และประการที่ 3 ต้องได้รับการยืนยันว่าเป็นการติดตั้งใช้งาน IMS ที่เชื่อถือได้ในการกำหนดค่าของผู้ให้บริการหรือการวางซ้อนอุปกรณ์
คําจํากัดความของบริการ
แอป IMS จะลงทะเบียน ImsService กับเฟรมเวิร์กโดยเพิ่มรายการ service
ลงในไฟล์ Manifest โดยใช้รูปแบบต่อไปนี้
<service
android:name="com.egcorp.ims.EgImsService"
android:directBootAware="true"
Android:persistent="true"
...
android:permission="android.permission.BIND_IMS_SERVICE" >
...
<intent-filter>
<action android:name="android.telephony.ims.ImsService" />
</intent-filter>
</service>
คําจํากัดความ service
ใน AndroidManifest.xml
กําหนดแอตทริบิวต์ต่อไปนี้ ซึ่งจําเป็นสําหรับการทํางานอย่างถูกต้อง
directBootAware="true"
: อนุญาตให้telephony
ค้นพบและเรียกใช้บริการได้ก่อนที่ผู้ใช้จะปลดล็อกอุปกรณ์ บริการจะเข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ไม่ได้ก่อนที่ผู้ใช้จะปลดล็อกอุปกรณ์ ดูข้อมูลเพิ่มเติมได้ที่รองรับโหมดการบูตโดยตรงและการเข้ารหัสตามไฟล์persistent="true"
: อนุญาตให้บริการนี้ทำงานอย่างต่อเนื่องและระบบจะไม่หยุดบริการนี้เพื่อเรียกคืนหน่วยความจำ แอตทริบิวต์นี้จะใช้งานได้ก็ต่อเมื่อแอปสร้างขึ้นเป็นแอประบบเท่านั้นpermission="android.permission.BIND_IMS_SERVICE"
: ตรวจสอบว่ามีเพียงกระบวนการที่ได้รับสิทธิ์BIND_IMS_SERVICE
เท่านั้นที่จะสามารถเชื่อมโยงกับแอปได้ ซึ่งจะช่วยป้องกันไม่ให้แอปที่เป็นอันตรายเชื่อมโยงกับบริการ เนื่องจากเฟรมเวิร์กจะมอบสิทธิ์ให้เฉพาะแอประบบเท่านั้น
บริการต้องระบุองค์ประกอบ intent-filter
ที่มีการดำเนินการ android.telephony.ims.ImsService
ด้วย ซึ่งจะช่วยให้เฟรมเวิร์กค้นหา ImsService
ได้
ข้อกําหนดของฟีเจอร์ IMS
หลังจากกำหนด ImsService เป็นบริการ Android ใน AndroidManifest.xml แล้ว ImsService จะต้องกำหนดว่ารองรับฟีเจอร์ IMS ใดบ้าง ปัจจุบัน Android รองรับฟีเจอร์ MmTel และ RCS แต่มีเพียง MmTel เท่านั้นที่ผสานรวมไว้ในเฟรมเวิร์ก แม้ว่าจะไม่มี RCS API ที่ผสานรวมเข้ากับเฟรมเวิร์ก แต่การประกาศ RCS เป็นฟีเจอร์ของ ImsService ก็ยังมีข้อดีอยู่
ด้านล่างนี้คือฟีเจอร์ที่ถูกต้องซึ่งกำหนดไว้ใน android.telephony.ims.ImsFeature
ที่ ImsService มอบให้ได้ รวมถึงคำอธิบายและตัวอย่างว่าเหตุใดแอป IMS จึงควรใช้ฟีเจอร์เหล่านี้อย่างน้อย 1 รายการ หลังจากกำหนดฟีเจอร์แต่ละรายการแล้ว หน้านี้จะอธิบายวิธีที่ ImsService
ประกาศชุดฟีเจอร์ที่กําหนดไว้สําหรับแต่ละช่อง SIM
FEATURE_MMTEL
ImsService
ใช้ฟีเจอร์ IMS MMTEL ซึ่งรองรับสื่อ IMS ทั้งหมด (ข้อกำหนด IR.92 และ IR.94) ยกเว้นการแนบข้อมูลในกรณีฉุกเฉินกับ PDN ของ IMS สำหรับการโทรฉุกเฉิน การติดตั้งใช้งาน ImsService
ที่ต้องการรองรับฟีเจอร์ MMTEL ควรขยายคลาสพื้นฐาน android.telephony.ims.MmTelFeature
และแสดงการติดตั้งใช้งาน MmTelFeature
ที่กําหนดเองใน ImsService#createMmTelFeature
FEATURE_EMERGENCY_MMTEL
การประกาศฟีเจอร์นี้เป็นเพียงการส่งสัญญาณให้แพลตฟอร์มทราบว่าสามารถแนบข้อมูลฉุกเฉินกับ PDN ของ IMS เพื่อรับบริการฉุกเฉินได้ หากไม่ได้ประกาศฟีเจอร์นี้สำหรับ ImsService
ของคุณ แพลตฟอร์มจะใช้การสลับวงจรสำรองสำหรับบริการฉุกเฉินเป็นค่าเริ่มต้นเสมอ ต้องกำหนดฟีเจอร์ FEATURE_MMTEL
เพื่อให้กำหนดฟีเจอร์นี้ได้
FEATURE_RCS
ImsService API ไม่ได้ใช้ฟีเจอร์ IMS RCS ใดๆ แต่คลาสพื้นฐาน android.telephony.ims.RcsFeature
ยังคงมีประโยชน์ เฟรมเวิร์กจะเชื่อมโยงกับ ImsService โดยอัตโนมัติและเรียก ImsService#createRcsFeature
เมื่อตรวจพบว่าแพ็กเกจควรให้บริการ RCS หากนำซิมการ์ดที่เชื่อมโยงกับบริการ RCS ออก เฟรมเวิร์กจะเรียกใช้ RcsFeature#onFeatureRemoved
โดยอัตโนมัติ จากนั้นจะล้าง ImsService
ที่เชื่อมโยงกับฟีเจอร์ RCS ฟังก์ชันการทำงานนี้สามารถนําตรรกะการตรวจหาหรือการเชื่อมโยงที่กําหนดเองบางส่วนออกได้ ซึ่งฟีเจอร์ RCS จะต้องระบุไว้
การลงทะเบียนฟีเจอร์ที่รองรับ
เฟรมเวิร์กโทรศัพท์จะเชื่อมโยงกับ ImsService ก่อนเพื่อค้นหาฟีเจอร์ที่รองรับโดยใช้ ImsService#querySupportedImsFeatures
API หลังจากเฟรมเวิร์กคำนวณว่า ImsService จะรองรับฟีเจอร์ใดบ้าง ก็จะเรียกใช้ ImsService#create[...]Feature
สำหรับฟีเจอร์แต่ละรายการที่ ImsService จะรับผิดชอบ หากฟีเจอร์ที่แอป IMS รองรับมีการเปลี่ยนแปลง คุณสามารถใช้ ImsService#onUpdateSupportedImsFeatures
เพื่อส่งสัญญาณให้เฟรมเวิร์กคำนวณฟีเจอร์ที่รองรับอีกครั้ง ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นและบอนด์ของ ImsService ได้ในแผนภาพต่อไปนี้
รูปที่ 2 การกำหนดค่าและบอนด์ ImsService
การตรวจหาเฟรมเวิร์กและยืนยันการติดตั้งใช้งาน ImsService
เมื่อกำหนด ImsService ใน AndroidManifest.xml อย่างถูกต้องแล้ว แพลตฟอร์มจะต้องได้รับการกำหนดค่าให้เชื่อมโยงกับ ImsService (อย่างปลอดภัย) เมื่อเหมาะสม ImsServices 2 ประเภทที่เฟรมเวิร์กจะเชื่อมโยงด้วย ได้แก่
- ผู้ให้บริการ "ลบล้าง" ImsService: ระบบจะโหลด ImsService เหล่านี้ลงในอุปกรณ์ไว้ล่วงหน้า แต่เชื่อมโยงกับผู้ให้บริการเครือข่ายมือถืออย่างน้อย 1 ราย และจะเชื่อมโยงก็ต่อเมื่อมีการใส่ซิมการ์ดที่ตรงกันเท่านั้น ซึ่งกำหนดค่าโดยใช้
config_ims_mmtel_package_override_string
คีย์ CarrierConfig สำหรับ ImsServices ที่ใช้ฟีเจอร์ MMTELconfig_ims_rcs_package_override_string
สําหรับ ImsServices ที่ใช้ฟีเจอร์ RCS
- ImsService "เริ่มต้น" ของอุปกรณ์: นี่คือ ImsService เริ่มต้นที่ OEM โหลดลงในอุปกรณ์ และควรออกแบบมาเพื่อให้บริการ IMS ในทุกสถานการณ์เมื่อไม่มี ImsService ของผู้ให้บริการ และมีประโยชน์ในสถานการณ์ที่อุปกรณ์ไม่ได้ใส่ซิมการ์ดหรือซิมการ์ดที่ใส่ไว้ไม่ได้ติดตั้ง ImsService ของผู้ให้บริการ ซึ่งจะกำหนดไว้ในการวางซ้อนอุปกรณ์โดยใช้การกำหนดค่าต่อไปนี้
config_ims_mmtel_package
: ใช้ฟีเจอร์ MMTELconfig_ims_rcs_package
: ใช้ฟีเจอร์ RCS
Android ไม่รองรับแอปที่มีการติดตั้งใช้งาน ImsService ที่ดาวน์โหลดได้จากบุคคลที่สาม ดังนั้นการติดตั้งใช้งาน ImsService ที่กําหนดไว้ที่นี่จะต้องเป็นแอประบบและต้องอยู่ในโฟลเดอร์ /system/priv-app/ หรือ /product/priv-app/ เพื่อให้สิทธิ์ที่เหมาะสม (ได้แก่ สิทธิ์เข้าถึงโทรศัพท์ ไมโครโฟน ตําแหน่ง กล้อง และรายชื่อติดต่อ) การยืนยันว่าชื่อแพ็กเกจของการติดตั้งใช้งาน IMS ตรงกับค่า CarrierConfig หรือค่าการวางซ้อนของอุปกรณ์ที่กําหนดไว้ข้างต้นจะเป็นการเชื่อมโยงเฉพาะแอปที่เชื่อถือและติดตั้งไว้ล่วงหน้าเท่านั้น
การปรับแต่ง
แอปที่ใช้ ImsService จะเชื่อมโยงในอุปกรณ์ที่กําหนดค่าเป็น ImsService "ลบล้าง" ของผู้ให้บริการหรือ ImsService "เริ่มต้น" ของอุปกรณ์สําหรับฟังก์ชัน MMTEL หรือ RCS เท่านั้น
นอกจากนี้ ImsService ยังช่วยให้เปิดหรือปิดใช้ฟีเจอร์ IMS ที่รองรับ (MMTEL และ RCS) แบบไดนามิกได้โดยใช้การอัปเดตด้วยวิธี ImsService#onUpdateSupportedImsFeatures
ซึ่งจะทริกเกอร์ให้เฟรมเวิร์กคำนวณใหม่ว่า ImsServices ใดเชื่อมโยงอยู่และฟีเจอร์ใดที่รองรับ หากแอป IMS อัปเดตเฟรมเวิร์กโดยไม่รองรับฟีเจอร์ใดๆ ระบบจะยกเลิกการเชื่อมโยง ImsService จนกว่าจะมีการรีบูตโทรศัพท์หรือใส่ซิมการ์ดใหม่ซึ่งตรงกับแอป IMS
ลำดับความสำคัญของการเชื่อมโยงสำหรับ ImsService หลายรายการ
เฟรมเวิร์กไม่รองรับการเชื่อมโยงกับ ImsService ที่เป็นไปได้ทั้งหมดซึ่งโหลดลงในอุปกรณ์ไว้ล่วงหน้า และจะเชื่อมโยงกับ ImsService ได้สูงสุด 2 รายการต่อช่อง SIM (ImsService 1 รายการสำหรับแต่ละฟีเจอร์) ตามลำดับต่อไปนี้ตามฟีเจอร์
- ชื่อแพ็กเกจ ImsService ที่กําหนดโดยค่า CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
เมื่อใส่ซิมการ์ดแล้ว - ชื่อแพ็กเกจ ImsService ที่กําหนดไว้ในค่าการวางซ้อนของอุปกรณ์สําหรับ
config_ims_[mmtel/rcs]_package
รวมถึงกรณีที่ไม่ได้ใส่ซิมการ์ด ImsService นี้ต้องรองรับฟีเจอร์ MmTel สำหรับกรณีฉุกเฉิน
คุณต้องกำหนดชื่อแพ็กเกจของ ImsService ใน CarrierConfig สำหรับผู้ให้บริการแต่ละรายที่จะใช้แพ็กเกจนั้น หรือในการวางซ้อนอุปกรณ์หาก ImsService จะเป็นค่าเริ่มต้นตามที่ระบุไว้ข้างต้น
มาดูรายละเอียดของแต่ละฟีเจอร์กัน สำหรับอุปกรณ์ (แบบซิมเดียวหรือหลายซิม) ที่มีซิมการ์ดเดียว คุณจะใช้งานฟีเจอร์ IMS ได้ 2 รายการ ได้แก่ MMTel และ RCS เฟรมเวิร์กจะพยายามเชื่อมโยงตามลำดับที่ระบุไว้ข้างต้นสำหรับฟีเจอร์แต่ละรายการ และหากฟีเจอร์ไม่พร้อมใช้งานสำหรับ ImsService ที่ระบุในการลบล้างการกำหนดค่าของผู้ให้บริการ เฟรมเวิร์กจะใช้ ImsService เริ่มต้นแทน ตัวอย่างเช่น ตารางด้านล่างอธิบายว่าเฟรมเวิร์กจะใช้ฟีเจอร์ IMS ใดสำหรับแอป IMS 3 รายการที่ใช้ ImsServices ซึ่งติดตั้งในระบบที่มีฟีเจอร์ต่อไปนี้
- ImsService ของผู้ให้บริการ ก รองรับ RCS
- ImsService ของผู้ให้บริการ ข. รองรับ RCS และ MMTel
- ImsService ของ OEM รองรับ RCS และ MMTel
ใส่ซิมการ์ดแล้ว | ฟีเจอร์ RCS | MMTel Feature |
---|---|---|
ผู้ให้บริการ ก | ผู้ให้บริการ ก | OEM |
ผู้ให้บริการ ข | ผู้ให้บริการ ข | ผู้ให้บริการ ข |
ไม่มีซิม | OEM | OEM |
การตรวจสอบความถูกต้อง
เครื่องมือสำหรับการยืนยันการติดตั้งใช้งาน IMS จะไม่รวมอยู่ด้วยเนื่องจากข้อกำหนดของ IMS มีขนาดใหญ่มากและใช้อุปกรณ์การยืนยันพิเศษ การทดสอบจะยืนยันได้เพียงว่าเฟรมเวิร์กโทรศัพท์ตอบสนองต่อ ImsService API อย่างถูกต้อง
พัฒนาแอป IMS
เมื่อพัฒนาแอป IMS ที่เชื่อมต่อกับสแต็กโทรศัพท์ของ Android เราขอแนะนำให้ระบุให้แอปสามารถฟังหรือแก้ไขสถานะของอินสแตนซ์ ImsService ที่แนบมากับการสมัครใช้บริการของผู้ให้บริการรายใดรายหนึ่ง
หากต้องการฟังหรือแก้ไขสถานะของ ImsService สำหรับฟีเจอร์ MMTEL และ RCS ให้ใช้คลาส ImsManager
เพื่อรับอินสแตนซ์ของคลาส ImsMmTelManager
, ImsRcsManager
หรือ ProvisioningManager
สำหรับ IMS โดยเฉพาะ จากนั้นแอปจะฟังสถานะการจัดสรรและบริการเฉพาะ IMS ได้ เช่น
- ฟีเจอร์ MMTEL หรือ RCS ที่เปิดใช้และพร้อมใช้งาน
- อัปเดตเมื่อสถานะการลงทะเบียน IMS เปลี่ยนแปลง
- สถานะการจัดสรรฟีเจอร์ IMS
- ฟีเจอร์ IMS ที่ผู้ใช้เปิดใช้
ใช้ ImsStateCallback
แม้ว่า ImsService จะเป็นบริการที่เชื่อมโยงอยู่ตลอด แต่บริการที่เชื่อมโยงไว้อาจเปลี่ยนแปลงเมื่อซิมการ์ดใหม่หรือการสมัครใช้บริการแบบฝังเริ่มทำงาน หรือเมื่อการกำหนดค่าของผู้ให้บริการเปลี่ยนแปลง เนื่องจาก ImsService ไม่ได้เป็นส่วนหนึ่งของกระบวนการโทรคมนาคม แอปจึงอาจพบข้อยกเว้นที่ไม่คาดคิดเมื่อพยายามเข้าถึง IMS API หาก ImsService ขัดข้องหรือยกเลิกการเชื่อมโยงโดยที่ผู้ใช้ไม่รู้ตัวเนื่องจากการเปลี่ยนแปลงการสมัครใช้บริการหรือการกําหนดค่า
ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป แอปสามารถใช้คลาส ImsStateCallback
เพื่อตรวจสอบว่าอินสแตนซ์ ImsService สำหรับการสมัครใช้บริการที่เชื่อมโยงพร้อมใช้งานหรือไม่ เมื่อรับอินสแตนซ์ของ ImsMmTelManager
หรือ ImsRcsManager
เราขอแนะนำให้แอปลงทะเบียนเพื่อรับการเรียกกลับสถานะ IMS ก่อนโดยใช้ ImsMmTelManager#registerImsStateCallback
หรือ ImsRcsManager#registerImsStateCallback
หากต้องการรับการอัปเดตการเรียกกลับสำหรับการสมัครใช้บริการที่เฉพาะเจาะจงต่อไปเมื่อ ImsService พร้อมใช้งานอีกครั้ง แอปต้องยกเลิกการลงทะเบียนหรือทิ้งการเรียกกลับที่มีอยู่ซึ่งลงทะเบียนผ่าน ImsMmTelManager
, ImsRcsManager
หรือ ProvisioningManager
และลงทะเบียนการเรียกกลับใหม่
หากมีการสมัครใช้บริการที่ไม่รองรับ IMS เฟรมเวิร์กจะเรียกใช้ ImsStateCallback#onUnavailable
พร้อมเหตุผล REASON_NO_IMS_SERVICE_CONFIGURED
ซึ่งหมายความว่า ImsService และ API ที่เกี่ยวข้องกับ IMS จะไม่พร้อมใช้งานสำหรับการสมัครใช้บริการ
ในกรณีที่กระบวนการโทรติดต่อขัดข้อง (ซึ่งเกิดขึ้นได้น้อยมาก) แอปจะได้รับ ImsStateCallback#onError
และจะไม่ได้รับการอัปเดตในอินสแตนซ์ ImsStateCallback
ที่ลงทะเบียนไว้อีกต่อไป
หากต้องการกู้คืนจากสถานะนี้ ให้ลงทะเบียนอินสแตนซ์ ImsStateCallback
อีกครั้งสําหรับการสมัครใช้บริการที่เกี่ยวข้องโดยเรียกใช้ ImsMmTelManager#registerImsStateCallback
หรือ ImsRcsManager#registerImsStateCallback