實施 IMS

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

ImsService 概述

圖 1. ImsService 概覽

通過ImsService接口,IMS實現者可以向平台提供重要的信令信息,如IMS註冊信息、SMS over IMS集成、MmTel功能集成,以提供語音和視頻通話。 ImsService API 也是一個 Android 系統 API,這意味著它可以直接針對 Android SDK 構建,而不是針對源代碼構建。預先安裝在設備上的 IMS 應用程序也可以配置為 Play Store 可更新。

示例和來源

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聲明此功能,則平台將始終默認使用 Circuit Switch Fallback 以提供緊急服務。必須定義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 卡或多 SIM 卡),兩個 IMS 功能是可能的:MMTel 和 RCS。框架將嘗試按照上面定義的順序為每個功能綁定,如果該功能不適用於運營商配置覆蓋中定義的 ImsService,則框架將回退到您的默認 ImsService。因此,例如,下表描述了框架將使用哪個 IMS 功能,假設三個 IMS 應用程序實現了安裝在具有以下功能的系統上的 ImsServices:

  • 運營商 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。