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) ยกเว้นการต่อเชื่อมฉุกเฉินกับ IMS PDN สำหรับการโทรหาหมายเลขฉุกเฉิน การใช้งาน ImsService
ที่ต้องการรองรับฟีเจอร์ MMTEL ควรขยายคลาสฐาน android.telephony.ims.MmTelFeature
และแสดงผลการใช้งาน MmTelFeature
ที่กําหนดเองใน ImsService#createMmTelFeature
FEATURE_EMERGENCY_MMTEL
การประกาศฟีเจอร์นี้เป็นเพียงการส่งสัญญาณให้แพลตฟอร์มทราบว่าสามารถแนบข้อมูลฉุกเฉินกับ PDN ของ IMS เพื่อรับบริการฉุกเฉินได้ หากไม่ได้ประกาศฟีเจอร์นี้สำหรับ ImsService
แพลตฟอร์มจะมีค่าเริ่มต้นเป็น Circuit Switch Fallback สำหรับบริการช่วยเหลือฉุกเฉินเสมอ ต้องกำหนดฟีเจอร์ 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