ใช้ IMS

Android 9 เปิดตัวอินเทอร์เฟซ SystemApi ใหม่ที่เรียกว่า ImsService เพื่อช่วยคุณติดตั้งใช้งาน IP Multimedia Subsystem (IMS) ImsService API เป็นอินเทอร์เฟซที่กําหนดไว้อย่างชัดเจนระหว่างแพลตฟอร์ม Android กับการใช้งาน IMS ที่ผู้ให้บริการหรือผู้ให้บริการเครือข่ายให้บริการ

ภาพรวมของ ImsService

รูปที่ 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 ได้ในแผนภาพต่อไปนี้

การเริ่มต้นและเชื่อมโยง ImsService

รูปที่ 2: การเริ่มต้นและเชื่อมโยง ImsService

การตรวจหาเฟรมเวิร์กและยืนยันการใช้งาน ImsService

เมื่อกำหนด ImsService ไว้อย่างถูกต้องใน AndroidManifest.xml แล้ว จะต้องมีการกำหนดค่าแพลตฟอร์มให้เชื่อมโยงกับ ImsService (อย่างปลอดภัย) ตามความเหมาะสม ImsServices 2 ประเภทที่เฟรมเวิร์กจะเชื่อมโยงด้วย ได้แก่

  1. ผู้ให้บริการ "ลบล้าง" ImsService: ระบบจะโหลด ImsService เหล่านี้ลงในอุปกรณ์ไว้ล่วงหน้า แต่เชื่อมโยงกับผู้ให้บริการเครือข่ายมือถืออย่างน้อย 1 ราย และจะเชื่อมโยงก็ต่อเมื่อมีการใส่ซิมการ์ดที่ตรงกันเท่านั้น ซึ่งกำหนดค่าโดยใช้
  2. ImsService "เริ่มต้น" ของอุปกรณ์: นี่คือ ImsService เริ่มต้นที่ OEM โหลดลงในอุปกรณ์ และควรออกแบบมาเพื่อให้บริการ IMS ในทุกสถานการณ์เมื่อไม่มี ImsService ของผู้ให้บริการ และมีประโยชน์ในสถานการณ์ที่อุปกรณ์ไม่ได้ใส่ซิมการ์ดหรือซิมการ์ดที่ใส่ไว้ไม่ได้ติดตั้ง ImsService ของผู้ให้บริการ ซึ่งจะกำหนดไว้ในการวางซ้อนอุปกรณ์โดยใช้การกำหนดค่าต่อไปนี้

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 รายการสำหรับแต่ละฟีเจอร์) ตามลำดับต่อไปนี้ตามฟีเจอร์

  1. ชื่อแพ็กเกจ ImsService ที่กําหนดโดยค่า CarrierConfig config_ims_[mmtel/rcs]_package_override_string เมื่อใส่ซิมการ์ดแล้ว
  2. ชื่อแพ็กเกจ 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