Android 9 เปิดตัวอินเทอร์เฟซ SystemApi ที่ชื่อ ImsService เพื่อช่วยคุณติดตั้งใช้งาน IP Multimedia Subsystem (IMS) API ของ ImsService เป็นอินเทอร์เฟซที่กำหนดไว้อย่างดีระหว่างแพลตฟอร์ม Android กับการติดตั้งใช้งาน IMS ที่ผู้ให้บริการหรือผู้ให้บริการเครือข่ายจัดหาให้
รูปที่ 1 ภาพรวม ImsService
การใช้อินเทอร์เฟซ ImsService ช่วยให้ผู้ใช้ IMS สามารถให้ข้อมูลการส่งสัญญาณที่สำคัญแก่แพลตฟอร์ม เช่น ข้อมูลการลงทะเบียน IMS, การผสานรวม SMS ผ่าน IMS และการผสานรวมฟีเจอร์ MmTel เพื่อให้บริการการโทรด้วยเสียงและวิดีโอ ImsService API ยังเป็น Android System API ด้วย ซึ่งหมายความว่าสามารถ สร้างกับ 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 จะมี API ของ ImsService แต่
อุปกรณ์ที่ใช้การติดตั้งใช้งาน IMS รุ่นเก่ากว่าจะไม่รองรับ API นี้
สำหรับอุปกรณ์เหล่านี้ ระบบได้ย้ายอินเทอร์เฟซ AIDL และคลาส Wrapper รุ่นเก่า
ไปยังเนมสเปซ android.telephony.ims.compat
แล้ว เมื่ออัปเกรดเป็น Android 9 อุปกรณ์รุ่นเก่าจะต้องทำดังนี้เพื่อรับการสนับสนุน API รุ่นเก่าต่อไป
- เปลี่ยนเนมสเปซของการติดตั้งใช้งาน ImsService เพื่อขยายจาก
android.telephony.ims.compat
API ของเนมสเปซ - แก้ไขคําจํากัดความบริการ ImsService ใน AndroidManifest.xml เพื่อใช้
android.telephony.ims.compat.ImsService
การกระทํา intent-filter แทน การกระทําandroid.telephony.ims.ImsService
จากนั้นเฟรมเวิร์กจะเชื่อมโยงกับ ImsService โดยใช้เลเยอร์ความเข้ากันได้
ที่ให้ไว้ใน Android 9 เพื่อทำงานร่วมกับImsService
การติดตั้งใช้งานเดิม
การลงทะเบียน ImsService กับเฟรมเวิร์ก
API ของ ImsService จะได้รับการติดตั้งใช้งานเป็นบริการที่เฟรมเวิร์ก Android
เชื่อมโยงด้วยเพื่อสื่อสารกับการติดตั้งใช้งาน IMS คุณต้องทำ 3 ขั้นตอนเพื่อลงทะเบียนแอปที่ใช้ ImsService กับเฟรมเวิร์ก
ก่อนอื่น การติดตั้งใช้งาน ImsService ต้องลงทะเบียนกับแพลตฟอร์มโดยใช้ AndroidManifest.xml
ของแอป ประการที่สอง ต้องกำหนดว่าการติดตั้งใช้งานรองรับฟีเจอร์ IMS ใด (MmTel หรือ RCS) และประการที่สาม ต้องได้รับการยืนยันว่าเป็นการติดตั้งใช้งาน 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 เท่านั้นที่ ผสานรวมเข้ากับเฟรมเวิร์ก แม้ว่าจะไม่มีการผสานรวม API ของ RCS เข้ากับเฟรมเวิร์ก แต่การประกาศให้เป็นฟีเจอร์ของ ImsService ก็ยังมีข้อดีอยู่
ด้านล่างนี้คือฟีเจอร์ที่ถูกต้องซึ่งกำหนดไว้ใน android.telephony.ims.ImsFeature
ที่
ImsService สามารถให้บริการได้ รวมถึงคำอธิบายและตัวอย่างว่าทำไมแอป IMS
จึงต้องการใช้ฟีเจอร์เหล่านี้อย่างน้อย 1 รายการ หลังจากกำหนดฟีเจอร์แต่ละรายการแล้ว หน้านี้จะอธิบายวิธีที่ ImsService
ประกาศชุดฟีเจอร์ที่กำหนดไว้สำหรับช่องใส่ซิมแต่ละช่อง
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
แพลตฟอร์มจะใช้การสำรองข้อมูลการสลับวงจรเป็นค่าเริ่มต้นสำหรับบริการฉุกเฉินเสมอ ต้องกำหนดฟีเจอร์ FEATURE_MMTEL
เพื่อกำหนดฟีเจอร์นี้
FEATURE_RCS
API ของ ImsService ไม่ได้ใช้ฟีเจอร์ RCS ของ IMS แต่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 เมื่อ เหมาะสม เฟรมเวิร์กจะเชื่อมโยงกับ ImsService 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
ซึ่งจะทริกเกอร์เฟรมเวิร์กให้
คำนวณใหม่ว่า ImsService ใดที่ผูกไว้และรองรับฟีเจอร์ใด หากแอป IMS อัปเดตเฟรมเวิร์กโดยไม่มีฟีเจอร์ที่รองรับ ระบบจะยกเลิกการเชื่อมโยง ImsService
จนกว่าจะรีบูตโทรศัพท์หรือใส่ซิมการ์ดใหม่ที่
ตรงกับแอป IMS
ลำดับความสำคัญของการเชื่อมโยงสำหรับ ImsService หลายรายการ
เฟรมเวิร์กไม่สามารถรองรับการเชื่อมโยงกับ ImsService ที่เป็นไปได้ทั้งหมดซึ่ง โหลดไว้ล่วงหน้าในอุปกรณ์ และจะเชื่อมโยงกับ ImsService สูงสุด 2 รายการต่อช่องใส่ซิม (ImsService 1 รายการต่อฟีเจอร์) ตามลำดับต่อไปนี้โดยอิงตามฟีเจอร์
- ชื่อแพ็กเกจ ImsService ที่กำหนดโดยค่า CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
เมื่อใส่ซิมการ์ด - ชื่อแพ็กเกจ ImsService ที่กำหนดไว้ในค่าการวางซ้อนของอุปกรณ์สำหรับ
config_ims_[mmtel/rcs]_package
รวมถึงกรณีที่ไม่ได้ใส่ซิมการ์ด ImsService นี้ต้องรองรับฟีเจอร์ MmTel ฉุกเฉิน
คุณต้องมีชื่อแพ็กเกจของ ImsService ที่กำหนดไว้ใน CarrierConfig สำหรับผู้ให้บริการแต่ละรายที่จะใช้แพ็กเกจนั้น หรือใน Device Overlay หาก ImsService จะเป็นค่าเริ่มต้นตามที่กำหนดไว้ข้างต้น
มาดูรายละเอียดของแต่ละฟีเจอร์กัน สำหรับอุปกรณ์ (ซิมเดียวหรือหลายซิม) ที่โหลดซิมการ์ดเดียว จะมีฟีเจอร์ IMS 2 อย่าง ได้แก่ MMTel และ RCS เฟรมเวิร์กจะพยายามเชื่อมโยงตามลำดับที่กำหนดไว้ข้างต้นสำหรับแต่ละฟีเจอร์ และ หากฟีเจอร์ไม่พร้อมใช้งานสำหรับ ImsService ที่กำหนดไว้ในการลบล้าง Carrier Configuration เฟรมเวิร์กจะกลับไปใช้ ImsService เริ่มต้นของคุณ เช่น ตารางด้านล่างอธิบายว่าเฟรมเวิร์กจะใช้ฟีเจอร์ IMS ใดเมื่อมีแอป IMS 3 แอปที่ใช้ ImsServices ติดตั้งอยู่ในระบบที่มีฟีเจอร์ต่อไปนี้
- ImsService ของผู้ให้บริการ ก รองรับ RCS
- ImsService ของผู้ให้บริการ B รองรับ RCS และ MMTel
- OEM ImsService รองรับ RCS และ MMTel
ใส่ซิมการ์ดแล้ว | ฟีเจอร์ RCS | ฟีเจอร์ MMTel |
---|---|---|
ผู้ให้บริการ ก | ผู้ให้บริการ ก | OEM |
ผู้ให้บริการ B | ผู้ให้บริการ B | ผู้ให้บริการ B |
ไม่มีซิม | OEM | OEM |
การตรวจสอบความถูกต้อง
เราไม่ได้รวมเครื่องมือสำหรับการยืนยันการติดตั้งใช้งาน IMS เอง เนื่องจากข้อกำหนด IMS มีขนาดใหญ่มากและต้องใช้อุปกรณ์ยืนยันพิเศษ การทดสอบจะยืนยันได้เฉพาะว่าเฟรมเวิร์กโทรศัพท์ตอบสนองต่อ API ของ ImsService อย่างถูกต้อง
พัฒนาแอป 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