Android 9 推出了名為 ImsService 的新 SystemApi 介面,可協助您實作 IP Multimedia Subsystem (IMS)。ImsService API 是 Android 平台與供應商或電信業者提供的 IMS 實作項目之間的明確介面。
圖 1. ImsService 簡介
使用 ImsService 介面後,IMS 導入者就能向平台提供重要的信號資訊,例如 IMS 註冊資訊、透過 IMS 整合的簡訊,以及 MmTel 功能整合,以提供語音和視訊通話。ImsService API 也是 Android System 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 的功能仍有優點。
以下是 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
宣告這項功能,平台一律會預設使用 Circuit Switch 備用服務。必須定義 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。架構會繫結至兩種類型的 ImsServices:
- 電信業者「覆寫」ImsService:這些 ImsService 會預先載入至裝置,但會連結至一或多個行動電信業者,且只有在插入相符的 SIM 卡時才會繫結。這項設定會使用
config_ims_mmtel_package_override_string
針對實作 MMTEL 功能的 ImsServices,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)。這會觸發架構重新計算哪些 ImsServices 已繫結,以及支援哪些功能。如果 IMS 應用程式更新架構為不支援的功能,則在重新啟動手機或插入與 IMS 應用程式相符的新 SIM 卡之前,ImsService 會解除繫結。
多個 ImsService 的繫結優先順序
這個架構無法支援所有已預先載入在裝置上的 ImsServices,並根據個別功能按照下列順序,以下列順序繫結至最多兩個 ImsServices (每項功能各一個 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 卡),可以使用 MMTel 和 RCS 兩種 IMS 功能。 此架構會嘗試以上述順序為每項功能繫結,如果 ImsService 無法在 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
類別取得 ImsMmTelManager
、ImsRcsManager
或 IMS 專屬 ProvisioningManager
類別的執行個體。接著,應用程式可以監聽 IMS 專屬服務及佈建狀態,例如:
- 已啟用且可用的 MMTEL 或 RCS 功能
- IMS 註冊狀態變更時接收最新消息
- IMS 功能的佈建狀態
- 使用者已啟用的 IMS 功能
使用 ImsStateCallback
雖然 ImsService 是持續繫結的服務,但當新的 SIM 卡或內嵌訂閱項目啟用,或是電信業者設定有所變更時,繫結的服務可能會變更。由於 ImsService 並非通訊過程的一部分,因此如果訂閱或設定變更導致 ImsService 無預警地當機或解除綁定,應用程式在嘗試存取 IMS API 時,可能會發生意外例外狀況。
在搭載 Android 13 以上版本的裝置上,應用程式可以使用 ImsStateCallback
類別,監控相關訂閱項目的 ImsService 執行個體是否可用或無法使用。取得 ImsMmTelManager
或 ImsRcsManager
例項時,建議應用程式先使用 ImsMmTelManager#registerImsStateCallback
或 ImsRcsManager#registerImsStateCallback
註冊 IMS 狀態回呼。如要繼續在 ImsService 再次可用時,針對特定訂閱項目接收回呼更新,應用程式必須取消註冊或捨棄透過 ImsMmTelManager
、ImsRcsManager
或 ProvisioningManager
註冊的現有回呼,並註冊新的回呼。
如果訂閱項目不支援 IMS,架構會以 REASON_NO_IMS_SERVICE_CONFIGURED
為理由呼叫 ImsStateCallback#onUnavailable
。也就是說,ImsService 和 IMS 相關 API 無法用於訂閱。
如果電話程序異常終止,應用程式會收到 ImsStateCallback#onError
,且不再接收已註冊的 ImsStateCallback
例項更新。如要從這個條件復原,請呼叫 ImsMmTelManager#registerImsStateCallback
或 ImsRcsManager#registerImsStateCallback
,重新註冊相關訂閱項目的 ImsStateCallback
例項。