การนำ IMS ไปใช้

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

ภาพรวมบริการ ImsService

รูปที่ 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 จะมี ImsService API แต่อุปกรณ์ที่ใช้ 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 แทนการดำเนินการ android.telephony.ims.ImsService

เฟรมเวิร์กจะเชื่อมโยงกับ ImsService โดยใช้เลเยอร์ความเข้ากันได้ที่มีให้ใน Android 9 เพื่อทำงานกับการใช้งาน ImsService ดั้งเดิม

การลงทะเบียน ImsService ด้วยกรอบงาน

ImsService API ได้รับการปรับใช้เป็นบริการซึ่งเฟรมเวิร์ก Android เชื่อมโยงเพื่อสื่อสารกับการใช้งาน IMS จำเป็นต้องมีสามขั้นตอนในการลงทะเบียนแอปพลิเคชันที่ใช้ ImsService กับเฟรมเวิร์ก ขั้นแรก การใช้งาน ImsService จะต้องลงทะเบียนตัวเองกับแพลตฟอร์มโดยใช้ AndroidManifest.xml ของแอปพลิเคชัน ประการที่สอง ต้องกำหนดคุณลักษณะ IMS ที่รองรับการใช้งาน (MmTel หรือ RCS) และประการที่สาม จะต้องได้รับการตรวจสอบว่าเป็นการใช้งาน IMS ที่เชื่อถือได้ ไม่ว่าจะในการกำหนดค่าของผู้ให้บริการหรือการซ้อนทับของอุปกรณ์

คำจำกัดความของการบริการ

แอปพลิเคชัน IMS ลงทะเบียน ImsService ด้วยเฟรมเวิร์กโดยเพิ่มรายการ service ลงในรายการโดยใช้รูปแบบต่อไปนี้:

<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 ก่อนที่ผู้ใช้จะปลดล็อคอุปกรณ์ บริการไม่สามารถเข้าถึงที่เก็บ ข้อมูลที่เข้ารหัสของอุปกรณ์ ก่อนที่ผู้ใช้จะปลดล็อคอุปกรณ์ สำหรับข้อมูลเพิ่มเติม โปรดดู ที่ รองรับโหมด Direct Boot และ File-Based Encryption
  • 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 ที่รวมอยู่ในเฟรมเวิร์ก แต่ก็ยังมีข้อดีในการประกาศว่าเป็นคุณลักษณะของ ImsService

ด้านล่างนี้คือคุณสมบัติที่ถูกต้องซึ่งกำหนดไว้ใน android.telephony.ims.ImsFeature ที่ ImsService สามารถให้ได้ รวมถึงคำอธิบายและตัวอย่างว่าทำไมแอปพลิเคชัน IMS ถึงต้องการใช้คุณสมบัติเหล่านี้อย่างใดอย่างหนึ่งหรือทั้งหมด หลังจากกำหนดคุณสมบัติแต่ละอย่างแล้ว หน้านี้สรุปวิธีที่ 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

การประกาศคุณลักษณะนี้เป็นเพียงการส่งสัญญาณไปยังแพลตฟอร์มว่าเหตุฉุกเฉินที่แนบมากับ IMS PDN สำหรับบริการฉุกเฉินนั้นเป็นไปได้ หากไม่ได้ประกาศคุณสมบัตินี้สำหรับ 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 มีสองประเภทที่เฟรมเวิร์กเชื่อมโยงกับ:

  1. ผู้ให้บริการ "แทนที่" ImsService: ImsServices เหล่านี้โหลดไว้ล่วงหน้าบนอุปกรณ์ แต่เชื่อมต่อกับผู้ให้บริการเครือข่ายโทรศัพท์เคลื่อนที่อย่างน้อยหนึ่งราย และจะถูกผูกไว้เมื่อมีการใส่ซิมการ์ดที่ตรงกันเท่านั้น สิ่งนี้ได้รับการกำหนดค่าโดยใช้
  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 หลายรายการ

เฟรมเวิร์กไม่รองรับการเชื่อมโยงกับ ImsServices ที่เป็นไปได้ทั้งหมดที่โหลดไว้ล่วงหน้าบนอุปกรณ์ และจะผูกกับ ImsServices สูงสุดสองรายการต่อช่องใส่ SIM (หนึ่ง ImsService สำหรับแต่ละคุณสมบัติ) ตามลำดับต่อไปนี้ตามคุณสมบัติ:

  1. ชื่อแพ็คเกจ ImsService ที่กำหนดโดยค่า CarrierConfig config_ims_[mmtel/rcs]_package_override_string เมื่อใส่ซิมการ์ด
  2. ชื่อแพ็คเกจ ImsService ที่กำหนดไว้ในค่าโอเวอร์เลย์อุปกรณ์สำหรับ config_ims_[mmtel/rcs]_package รวมถึงกรณีที่ไม่ได้ใส่ซิมการ์ด ImsService นี้จะต้องรองรับคุณสมบัติ MmTel ฉุกเฉิน

คุณต้องมีชื่อแพ็คเกจของ ImsService ของคุณที่กำหนดไว้ใน CarrierConfig สำหรับผู้ให้บริการแต่ละรายที่จะใช้แพ็คเกจนั้นหรือในโอเวอร์เลย์อุปกรณ์ หาก ImsService ของคุณจะเป็นค่าเริ่มต้นตามที่กำหนดไว้ข้างต้น

เรามาดูรายละเอียดแต่ละฟีเจอร์กันดีกว่า สำหรับอุปกรณ์ (ซิมเดียวหรือหลายซิม) ที่โหลดซิมการ์ดตัวเดียว สามารถใช้คุณสมบัติ IMS ได้สองแบบ: MMTel และ RCS กรอบงานจะพยายามเชื่อมโยงตามลำดับที่กำหนดไว้ข้างต้นสำหรับแต่ละคุณสมบัติ และหากคุณสมบัติไม่พร้อมใช้งานสำหรับ ImsService ที่กำหนดไว้ในการแทนที่การกำหนดค่าผู้ให้บริการ กรอบงานจะย้อนกลับไปยัง ImsService เริ่มต้นของคุณ ตัวอย่างเช่น ตารางด้านล่างอธิบายว่าคุณลักษณะ IMS ใดที่เฟรมเวิร์กจะใช้โดยระบุแอปพลิเคชัน IMS สามตัวที่ใช้งาน ImsServices ที่ติดตั้งบนระบบที่มีคุณสมบัติดังต่อไปนี้:

  • ผู้ให้บริการ A ImsService รองรับ RCS
  • Carrier B ImsService รองรับ RCS และ MMTel
  • OEM ImsService รองรับ RCS และ MMTel
ใส่ซิมการ์ดแล้ว คุณสมบัติ RCS คุณสมบัติ MMTel
ผู้ให้บริการ A ผู้ให้บริการ A OEM
ผู้ให้บริการ B ผู้ให้บริการ B ผู้ให้บริการ B
ไม่มีซิม 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 ขึ้นไป เพื่อตรวจสอบว่าอินสแตนซ์ ImsService สำหรับการสมัครสมาชิกที่เกี่ยวข้องพร้อมใช้งานหรือไม่พร้อมใช้งาน แอปสามารถใช้คลาส ImsStateCallback เมื่อได้รับอินสแตนซ์ของ 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