實施IMS

Android 9 引入了一個名為ImsService的新 SystemApi 接口,可協助您實現 IP 多媒體子系統 (IMS)。 ImsService API 是 Android 平台與供應商或營運商提供的 IMS 實作之間定義良好的介面。

Ims服務概述

圖 1. ImsService 概述

透過使用 ImsService 接口,IMS 實現者可以向平台提供重要的信令訊息,例如 IMS 註冊資訊、SMS over IMS 整合以及 MmTel 功能整合以提供語音和視訊通話。 ImsService API 也是一個 Android 系統 API,這意味著它可以直接針對 Android SDK 而不是針對原始程式碼進行建置。裝置上預先安裝的 IMS 應用程式也可以配置為可透過 Play 商店更新。

範例和來源

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 應用程式透過使用以下格式將service條目新增至清單中,向框架註冊 ImsService:

<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權限的進程才能綁定到應用程式。這可以防止惡意應用程式綁定到服務,因為框架只能向系統應用程式授予權限。

本服務也必須透過操作android.telephony.ims.ImsService指定intent-filter元素。這允許框架找到ImsService

IMS功能規範

在 AndroidManifest.xml 中將 ImsService 定義為 Android 服務後,ImsService 必須定義它支援哪些 IMS 功能。 Android 目前支援 MmTel 和 RCS 功能,但只有 MmTel 整合到框架中。儘管框架中沒有整合 RCS API,但將其聲明為 ImsService 的功能仍有優勢。

以下是 ImsService 可以提供的android.telephony.ims.ImsFeature中定義的有效功能,以及 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基底類別仍然有用。當框架偵測到套件應提供 RCS 時,框架會自動綁定到 ImsService 並呼叫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 或裝置「預設」ImsService 配置以實現 MMTEL 或 RCS 功能的裝置上。 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. config_ims_[mmtel/rcs]_package的裝置覆蓋值中定義的 ImsService 套件名稱,包括未插入 SIM 卡的情況。此 ImsService 必須支援緊急 MmTel 功能。

您必須在將使用該套件的每個營運商的 CarrierConfig 中定義 ImsService 的套件名稱,或者如果您的 ImsService 將是預設值(如上所述),則必須在裝置覆蓋層中定義該名稱。

讓我們針對每個功能進行分解。對於載入單 SIM 卡的裝置(單或多 SIM 卡),可以使用兩種 IMS 功能:MMTel 和 RCS。框架將嘗試按照上面定義的順序綁定每個功能,如果該功能不可用於運營商配置覆蓋中定義的 ImsService,則框架將回退到預設的 ImsService。例如,下表描述了框架將使用哪些 IMS 功能,假設系統上安裝了三個實現 ImsServices 的 IMS 應用程序,且具有以下功能:

  • 運營商 A ImsService 支援 RCS
  • 營運商 B ImsService 支援 RCS 和 MMTel
  • OEM ImsService 支援 RCS 和 MMTel
SIM 卡已插入RCS特性MM電話功能
運營商A運營商A代加工
運營商B運營商B運營商B
無 SIM 卡代加工代加工

驗證

由於 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實例。