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

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 (อย่างปลอดภัย) เมื่อเหมาะสม เฟรมเวิร์กจะผูกกับ 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 นี้ต้องรองรับฟีเจอร์ Emergency MmTel

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

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

  • ImsService ของผู้ให้บริการ ก รองรับ RCS
  • ImsService ของผู้ให้บริการ ข รองรับ RCS และ MMTel
  • ImsService ของ OEM รองรับ RCS และ MMTel
ใส่ซิมการ์ด ฟีเจอร์ RCS ฟีเจอร์ MMTel
ผู้ให้บริการ ก ผู้ให้บริการ ก 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