ใช้ 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) ยกเว้นการแนบข้อมูลในกรณีฉุกเฉินกับ 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 ได้ในแผนภาพต่อไปนี้

การจัดเตรียมและเชื่อมโยง 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