實作 IMS

Android 9 導入了名為 ImsService 協助您實作 IP 多媒體子系統 (IMS)。ImsService API 是一種 Android 平台與供應商之間定義明確的介面 實作電信業者提供的 IMS 實作

ImsService 總覽

圖 1. ImsService 總覽

透過使用 ImsService 介面,IMS 實作器可以提供 向平台傳送資訊,例如 IMS 註冊資訊 整合 IMS,並且整合 MmTel 功能,可提供語音和視訊功能 撥號中.ImsService API 也是 Android System API,表示 。IMS 裝置上預先安裝的應用程式也可以設為 可以透過 Play 商店更新

範例和來源

Android 透過 Android 開放原始碼計畫提供應用程式,會實作應用程式的某些部分 用於測試和開發用途的 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 動作。

接著,架構會使用相容性層繫結至 ImsService 才能使用舊版 Search Ads 360 ImsService 實作。

使用架構註冊 ImsService

ImsService API 是以服務的形式實作,也就是 Android 架構 繫結至 IMS 實作。三個步驟 ,以便使用 這個架構的重點在於首先,ImsService 實作必須自行向 使用應用程式的AndroidManifest.xml應用程式;第二,您必須 定義實作作業支援的 IMS 功能 (MmTel 或 RCS);第三 必須在電信業者內驗證為值得信賴的 IMS 實作 設定或裝置重疊。

服務定義

IMS 應用程式透過新增 將 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 必須定義其支援的 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。任何想要的 ImsService 實作 支援 MMTEL 功能,應擴充 android.telephony.ims.MmTelFeature 基礎類別並傳回自訂 MmTelFeature 實作 ImsService#createMmTelFeature

FEATURE_EMERGENCY_MMTEL (模式)

宣告這項功能後,只會向平台表明緊急狀況與 IMS PDN 適用緊急救援服務。如未針對這項功能宣告 ImsService,平台一律會預設使用 Circuit Switch 備用方案 以便撥打緊急救援服務電話必須為此定義 FEATURE_MMTEL 功能 一個待定義的特徵

FEATURE_RCS

ImsService API 不會實作任何 IMS RCS 功能,但 android.telephony.ims.RcsFeature 基礎類別仍為實用。架構 會自動繫結至 ImsService 並呼叫 ImsService#createRcsFeature 系統偵測到套件應提供 RCS 時。如果 SIM 卡已連結 RCS 服務遭移除後,該架構就會自動呼叫 RcsFeature#onFeatureRemoved,然後清除相關聯的 ImsService RCS 功能這項功能可以移除 RCS 功能額外提供的偵測或繫結邏輯。

註冊支援的功能

電話架構會先繫結至 ImsService,以查詢會 並支援使用 ImsService#querySupportedImsFeatures API在 架構計算了 ImsService 支援的功能, ImsService#create[...]Feature,針對每項由 ImsService 發布的功能 負責的部分如果 IMS 應用程式支援的功能有所變更, 可以使用 ImsService#onUpdateSupportedImsFeatures 向架構傳送信號 重新計算支援的功能詳情請參閱下圖 ImsService 的初始化和繫結作業

ImsService 初始化與繫結

圖 2:ImsService 初始化和繫結

ImsService 實作的架構偵測和驗證

在 AndroidManifest.xml 中正確定義 ImsService 後, 平台必須在 或適當。這個架構會繫結至兩種 ImsServices:

  1. 電信業者「覆寫」ImsService:這些 ImsServices 會預先載入至 裝置但與一或多個行動電信業者連線, 插入相符的 SIM 卡時繫結。這項設定會使用
  2. 裝置「預設」ImsService:這是所載入的預設 ImsService 提交到裝置上,且在設計上應以 則適合用來處理 裝置未插入 SIM 卡或 SIM 卡 未插入任何電信業者 ImsService。這是 使用以下設定 (在裝置疊加層中定義):

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

自訂

只有實作 ImsService 的應用程式才會繫結至其平台 已設為「覆寫」電信業者ImsService 或裝置「預設」 MMTEL 或 RCS 功能的 ImsService 設定。 ImsService 還允許其支援的 IMS 功能 (MMTEL 和 RCS) 可以手動啟用或停用 ImsService#onUpdateSupportedImsFeatures 方法。將觸發架構 重新計算 ImsServices 綁定的項目及支援的功能。如果 IMS 應用程式更新架構時,系統不支援其中的功能,ImsService 直到手機重新啟動或插入新的 SIM 卡為止 符合 IMS 應用程式。

多個 ImsService 的繫結優先順序

這個架構無法支援繫結至所有可能為 已預先載入在裝置上,且每個 SIM 卡插槽最多會繫結至兩個 ImsServices (每項功能各有一個 ImsService)。

  1. 由 CarrierConfig 值定義的 ImsService 套件名稱 使用 SIM 卡時:config_ims_[mmtel/rcs]_package_override_string 已插入
  2. 裝置疊加值中定義的 ImsService 套件名稱,為 config_ims_[mmtel/rcs]_package包括沒有 SIM 卡的保護殼 已插入卡片。這項 ImsService「必須」支援緊急 MmTel 功能。

您必須擁有在 針對會使用該套件或 裝置重疊 (如上文定義)。

現在,我們會詳細說明每項功能。裝置 (單一或多張 SIM 卡) 載入了一張 SIM 卡,就能使用 MMTel 和 RCS 兩種 IMS 功能。 架構會嘗試按上述定義順序,為每個功能與 表示該功能不適用於電信業者定義的 ImsService 設定覆寫後,架構將改回使用預設的 ImsService。 舉例來說,下表說明瞭架構將為 使用安裝在系統上的三個 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 不屬於 電話處理程序,應用程式可能會在嘗試時遇到預料之外的例外狀況 存取 IMS API,以免 ImsService 意外當機或因為 訂閱方案或設定變更

在搭載 Android 13 以上版本的裝置上監控 相關訂閱項目的 ImsService 執行個體是否為 可以使用或無法使用 ImsStateCallback敬上 類別取得 ImsMmTelManagerImsRcsManager 的例項時, 建議應用程式先使用 ImsMmTelManager#registerImsStateCallback敬上 或 ImsRcsManager#registerImsStateCallback。 如要在發生以下情況時繼續接收特定訂閱項目的回呼更新: ImsService 再次可供使用,應用程式必須取消註冊或捨棄現有項目 透過 ImsMmTelManagerImsRcsManagerProvisioningManager;並註冊新的回呼。

如果訂閱項目不支援 IMS,架構會呼叫 ImsStateCallback#onUnavailable敬上 並說明原因 REASON_NO_IMS_SERVICE_CONFIGURED。 也就是說,ImsService 和 IMS 相關 API 不適用於 訂閱項目中的所有進階功能!

在電話程序異常終止的情況下,應用程式會收到 ImsStateCallback#onError敬上 且不會再收到已註冊的 ImsStateCallback 執行個體更新。 如要從這個條件復原,請為以下項目重新註冊 ImsStateCallback 例項: 呼叫相關訂閱項目 ImsMmTelManager#registerImsStateCallbackImsRcsManager#registerImsStateCallback