實作 IMS

Android 9 導入名為 ImsService 的 SystemApi 介面,可協助您實作 IP 多媒體子系統 (IMS)。ImsService API 是 Android 平台與供應商或電信業者提供的 IMS 實作項目之間的明確介面。

ImsService 總覽

圖 1. ImsService 總覽

透過 ImsService 介面,IMS 實作人員可以向平台提供重要的信號資訊,例如 IMS 註冊資訊、透過 IMS 整合的簡訊,以及整合 MmTel 功能來提供語音和視訊通話。ImsService API 也是 Android 系統 API,因此可以直接根據 Android SDK 建構,不必根據來源建構。裝置預先安裝的 IMS 應用程式也可以設定為可透過 Play 商店更新。

範例和來源

Android 在 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 介面和封裝類別已移至 android.telephony.ims.compat 命名空間。升級至 Android 9 時,舊版裝置必須執行下列操作,才能繼續支援舊版 API。

  • 變更 ImsService 實作的命名空間,從 android.telephony.ims.compat 命名空間 API 擴充。
  • 修改 AndroidManifest.xml 中的 ImsService 服務定義,使用 android.telephony.ims.compat.ImsService 意圖篩選器動作,而非 android.telephony.ims.ImsService 動作。

架構接著會使用 Android 9 提供的相容性層,繫結至 ImsService,以便與舊版 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>

AndroidManifest.xml 中的 service 定義會定義下列屬性,這些屬性是正確運作的必要條件:

  • directBootAware="true":允許服務在使用者解鎖裝置前,由 telephony 探索及執行。使用者解鎖裝置前,服務無法存取裝置加密儲存空間。詳情請參閱「支援直接啟動模式」和「以檔案為基礎的加密」。
  • persistent="true":允許這項服務持續執行,不會因系統回收記憶體而終止。只有在應用程式建構為系統應用程式時,這項屬性才有效。
  • permission="android.permission.BIND_IMS_SERVICE":確保只有獲得 BIND_IMS_SERVICE 權限的程序可以繫結至應用程式。這可防止惡意應用程式繫結至服務,因為只有系統應用程式可以透過架構獲得權限。

服務也必須指定 intent-filter 元素和 android.telephony.ims.ImsService 動作。架構就能找到 ImsService

IMS 功能規格

在 AndroidManifest.xml 中將 ImsService 定義為 Android 服務後,ImsService 必須定義支援的 IMS 功能。Android 目前支援 MmTel 和 RCS 功能,但只有 MmTel 整合到架構中。雖然架構中未整合 RCS API,但將其宣告為 ImsService 的功能仍有優點。

以下是 android.telephony.ims.ImsFeature中定義的有效功能,ImsService 可以提供這些功能,並說明 IMS 應用程式為何要實作其中一項或所有功能,以及提供相關範例。定義各項功能後,這個頁面會說明 ImsService 如何為每個 SIM 卡插槽宣告定義的功能集。

FEATURE_MMTEL

ImsService 會實作 IMS MMTEL 功能,其中包含對所有 IMS 媒體 (IR.92 和 IR.94 規格) 的支援,但緊急呼叫的 IMS PDN 緊急附加除外。如要支援 MMTEL 功能,ImsService 的任何實作項目都應擴充 android.telephony.ims.MmTelFeature 基礎類別,並在 ImsService#createMmTelFeature 中傳回自訂 MmTelFeature 實作項目。

FEATURE_EMERGENCY_MMTEL

聲明這項功能只會向平台發出訊號,表示緊急服務可附加至 IMS PDN。如果未針對 ImsService 宣告這項功能,平台一律會預設使用電路交換回退功能撥打緊急救援服務電話。必須先定義 FEATURE_MMTEL 功能,才能定義這項功能。

FEATURE_RCS

ImsService API 不會實作任何 IMS RCS 功能,但 android.telephony.ims.RcsFeature 基礎類別仍可派上用場。架構會自動繫結至 ImsService,並在偵測到套件應提供 RCS 時呼叫 ImsService#createRcsFeature。如果移除與 RCS 服務相關聯的 SIM 卡,架構會自動呼叫 RcsFeature#onFeatureRemoved,然後清除與 RCS 功能相關聯的 ImsService。這項功能可以移除 RCS 功能原本必須提供的部分自訂偵測或繫結邏輯。

註冊支援的功能

電話架構會先繫結至 ImsService,使用 ImsService#querySupportedImsFeatures API 查詢支援的功能。架構計算出 ImsService 將支援哪些功能後,就會針對 ImsService 負責的每個功能呼叫 ImsService#create[...]Feature。如果 IMS 應用程式支援的功能有所變更,您可以使用 ImsService#onUpdateSupportedImsFeatures 通知架構重新計算支援的功能。如要進一步瞭解 ImsService 的初始化和繫結,請參閱下圖。

ImsService 初始化及繫結

圖 2. ImsService 初始化和繫結

偵測架構並驗證 ImsService 實作項目

在 AndroidManifest.xml 中正確定義 ImsService 後,平台必須設定為在適當時間 (安全地) 繫結至 ImsService。架構會繫結至兩種 ImsService:

  1. 電信業者「覆寫」ImsService:這些 ImsService 會預先載入裝置,但會附加至一或多個行動網路電信業者,且只有在插入相符的 SIM 卡時才會繫結。這項設定會使用
  2. 裝置「預設」ImsService:這是 OEM 載入裝置的預設 ImsService,應設計為在沒有電信業者 ImsService 的情況下,提供所有情況的 IMS 服務,且在裝置未插入 SIM 卡或插入的 SIM 卡未安裝電信業者 ImsService 時很有用。這是使用下列設定在裝置疊加層中定義的:

Android 不支援具有第三方可下載 ImsService 實作項目的應用程式,因此這裡定義的任何 ImsService 實作項目都必須是系統應用程式,且必須位於 /system/priv-app/ 或 /product/priv-app/ 資料夾中,才能授予適當的權限 (即電話、麥克風、位置資訊、相機和聯絡人權限)。藉由驗證 IMS 實作的套件名稱是否與上述定義的 CarrierConfig 或裝置疊加值相符,確保只有受信任的預先安裝應用程式會繫結。

自訂

只有在裝置上設定為電信業者「覆寫」ImsService 或裝置「預設」ImsService 設定 (適用於 MMTEL 或 RCS 功能) 時,實作 ImsService 的應用程式才會繫結。此外,ImsService 也允許使用 ImsService#onUpdateSupportedImsFeatures 方法更新,動態啟用或停用支援的 IMS 功能 (MMTEL 和 RCS)。這會觸發架構重新計算繫結的 ImsService,以及這些服務支援的功能。如果 IMS 應用程式更新架構時沒有支援任何功能,系統會解除 ImsService 的繫結,直到手機重新啟動,或插入與 IMS 應用程式相符的新 SIM 卡為止。

多個 ImsService 的繫結優先順序

架構無法支援繫結至預先載入裝置的所有可能 ImsService,且每個 SIM 卡插槽最多會繫結兩個 ImsService (每個功能各一個 ImsService),順序如下:

  1. 插入 SIM 卡時,由 CarrierConfig 值 config_ims_[mmtel/rcs]_package_override_string 定義的 ImsService 套件名稱。
  2. 裝置疊加值中定義的 ImsService 套件名稱,適用於 config_ims_[mmtel/rcs]_package,包括未插入 SIM 卡的情況。這個 ImsService 必須支援緊急 MmTel 功能。

如要使用該套件,您必須在每個電信業者的 CarrierConfig 中定義 ImsService 的套件名稱,或是如上所述,在裝置疊加層中定義 ImsService 的套件名稱 (如果 ImsService 是預設服務)。

我們將針對各項功能詳細說明。如果裝置 (單卡或多卡) 已載入單一 SIM 卡,則可使用兩種 IMS 功能:MMTel 和 RCS。架構會嘗試依上述順序繫結各項功能,如果 Carrier Configuration 覆寫中定義的 ImsService 無法使用該功能,架構就會回復為預設的 ImsService。舉例來說,下表說明在系統上安裝三個實作 ImsServices 的 IMS 應用程式後,架構會使用哪些 IMS 功能。系統具備下列功能:

  • 電信業者 A 的 ImsService 支援 RCS
  • 電信業者 B 的 ImsService 支援 RCS 和 MMTel
  • OEM ImsService 支援 RCS 和 MMTel
已插入 SIM 卡 RCS 功能 MMTel 功能
貨運公司 A 貨運公司 A 原始設備製造商 (OEM)
電信業者 B 電信業者 B 電信業者 B
沒有 SIM 卡 原始設備製造商 (OEM) 原始設備製造商 (OEM)

驗證

由於 IMS 規格非常龐大,且需要使用特殊驗證設備,因此我們未提供驗證 IMS 實作方式的工具。測試只能驗證電話架構是否正確回應 ImsService API。

開發 IMS 應用程式

開發與 Android 電話堆疊介接的 IMS 應用程式時,建議您指定應用程式可監聽或修改特定電信業者訂閱方案所附加的 ImsService 執行個體狀態。

如要監聽或修改 MMTEL 和 RCS 功能的 ImsService 狀態,請使用 ImsManager 類別取得 ImsMmTelManagerImsRcsManager 或 IMS 專屬 ProvisioningManager 類別的執行個體。應用程式隨後即可監聽 IMS 專屬服務和佈建狀態,例如:

  • 已啟用及可用的 MMTEL 或 RCS 功能
  • IMS 註冊狀態變更時更新
  • IMS 功能的佈建狀態
  • 使用者已啟用的 IMS 功能

使用 ImsStateCallback

雖然 ImsService 是持續繫結的服務,但當新的 SIM 卡或內嵌訂閱方案啟用,或是電信業者設定變更時,繫結的服務可能會變更。由於 ImsService 並非電話程序的一部分,如果 ImsService 因訂閱或設定變更而無預警當機或取消繫結,應用程式嘗試存取 IMS API 時可能會發生非預期例外狀況。

在搭載 Android 13 以上版本的裝置上,如要監控相關聯訂閱項目的 ImsService 執行個體是否可用,應用程式可以使用 ImsStateCallback 類別。取得 ImsMmTelManagerImsRcsManager 的執行個體時,建議應用程式先使用 ImsMmTelManager#registerImsStateCallbackImsRcsManager#registerImsStateCallback 註冊 IMS 狀態回呼。如要讓應用程式在 ImsService 再次可用時,繼續接收特定訂閱項目的回呼更新,必須取消註冊或捨棄透過 ImsMmTelManagerImsRcsManagerProvisioningManager 註冊的現有回呼,並註冊新的回呼。

如果訂閱項目不支援 IMS,架構會呼叫 ImsStateCallback#onUnavailable,並提供 REASON_NO_IMS_SERVICE_CONFIGURED 原因。這表示訂閱方案無法使用 ImsService 和 IMS 相關 API。

萬一電話程序當機,應用程式會收到 ImsStateCallback#onError,且不再接收已註冊 ImsStateCallback 執行個體的更新。如要從這個情況復原,請呼叫 ImsMmTelManager#registerImsStateCallbackImsRcsManager#registerImsStateCallback,重新註冊相關聯訂閱項目的 ImsStateCallback 執行個體。