Android 9 引入了一個名為ImsService的新 SystemApi 接口,可協助您實現 IP 多媒體子系統 (IMS)。 ImsService API 是 Android 平台與供應商或營運商提供的 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 的初始化和綁定的更多信息,請參見下圖。
圖 2: ImsService 初始化和綁定
ImsService 實作的框架檢測與驗證
在 AndroidManifest.xml 中正確定義 ImsService 後,必須將平台配置為在適當時(安全性)綁定到 ImsService。框架綁定到兩種類型的 ImsService:
- 運營商「覆蓋」ImsService:這些 ImsService 預先載入到裝置上,但附加到一個或多個蜂窩運營商,並且僅在插入匹配的 SIM 卡時才會綁定。這是使用以下配置的
config_ims_mmtel_package_override_string
ImsServices 實作 MMTEL 功能的 CarrierConfig 金鑰。-
config_ims_rcs_package_override_string
用於實作 RCS 功能的 ImsServices。
- 裝置「預設」ImsService:這是由 OEM 載入到裝置上的預設 ImsService,應設計為在營運商 ImsService 不可用時的所有情況下提供 IMS 服務,並且在裝置沒有 SIM 卡的情況下很有用已插入或插入的SIM 卡未安裝營運商ImsService。這是使用以下配置在設備覆蓋層中定義的:
-
config_ims_mmtel_package
:實作 MMTEL 功能 config_ims_rcs_package
:實作 RCS 功能
-
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):
- 當插入 SIM 卡時,由 CarrierConfig 值
config_ims_[mmtel/rcs]_package_override_string
定義的 ImsService 套件名稱。 - 在
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
類別取得ImsMmTelManager
、 ImsRcsManager
或 IMS 特定的ProvisioningManager
類別的實例。然後,該應用程式可以偵聽特定於 IMS 的服務和配置狀態,例如:
- 已啟用且可用的 MMTEL 或 RCS 功能
- 當 IMS 註冊狀態變更時更新
- IMS功能開通狀態
- 用戶已啟用的 IMS 功能
使用 ImsStateCallback
儘管 ImsService 是持久綁定的服務,但當新的 SIM 卡或嵌入式訂閱變為活動狀態或運營商配置變更時,綁定的服務可能會發生變更。由於 ImsService 不是電話流程的一部分,因此,如果 ImsService 由於訂閱或配置變更而無形地崩潰或未綁定,則應用程式在嘗試存取 IMS API 時可能會遇到意外異常。
在執行 Android 13 或更高版本的裝置上,要監視關聯訂閱的 ImsService 實例是否可用,應用程式可以使用ImsStateCallback
類別。在取得ImsMmTelManager
或ImsRcsManager
的實例時,我們建議應用程式先使用ImsMmTelManager#registerImsStateCallback
或ImsRcsManager#registerImsStateCallback
註冊 IMS 狀態回呼。若要在 ImsService 再次可用時繼續接收特定訂閱的回呼更新,應用程式必須取消註冊或丟棄透過ImsMmTelManager
、 ImsRcsManager
或ProvisioningManager
註冊的現有回呼;並註冊新的回調。
如果存在不支援 IMS 的訂閱,框架會呼叫ImsStateCallback#onUnavailable
,原因為REASON_NO_IMS_SERVICE_CONFIGURED
。這意味著 ImsService 和 IMS 相關的 API 不可用於訂閱。
萬一電話進程崩潰,應用程式會收到ImsStateCallback#onError
並且不再接收已註冊ImsStateCallback
實例的更新。若要從此情況中恢復,請透過呼叫ImsMmTelManager#registerImsStateCallback
或ImsRcsManager#registerImsStateCallback
重新註冊關聯訂閱的ImsStateCallback
實例。