ติดตั้งใช้งาน IMS

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

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

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

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

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

ลำดับความสำคัญของการเชื่อมโยงสำหรับ ImsService หลายรายการ

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

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