Android 9 では、 ImsServiceと呼ばれる新しい SystemApi インターフェースが導入され、IP Multimedia Subsystem (IMS) の実装に役立ちます。 ImsService API は、Android プラットフォームと、ベンダーまたは通信事業者が提供する IMS 実装との間の明確に定義されたインターフェイスです。
図 1. ImsService の概要
IMS の実装者は、ImsService インターフェイスを使用して、IMS 登録情報、SMS over IMS 統合、MmTel 機能統合などの重要なシグナリング情報をプラットフォームに提供して、音声通話とビデオ通話を提供できます。 ImsService API は Android システム API でもあります。つまり、ソースに対してではなく、Android SDK に対して直接ビルドできます。デバイスにプリインストールされている IMS アプリケーションも、Play ストアで更新できるように構成できます。
例とソース
Android は、テストおよび開発目的で ImsService API の一部を実装する AOSP 上のアプリケーションを提供します。アプリケーションは/testapps/ImsTestServiceにあります。
ImsService API のドキュメントは、 ImsServiceおよび API の他のクラスにあります。
実装
ImsService API は、使用可能なハードウェアに応じて、さまざまな方法で IMS を実装できる高レベル API です。たとえば、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.ImsService
アクションの代わりにandroid.telephony.ims.compat.ImsService
インテント フィルター アクションを使用します。
フレームワークは、Android 9 で提供される互換性レイヤーを使用して ImsService にバインドし、従来のImsService
実装と連携します。
フレームワークへの ImsService 登録
ImsService API は、IMS 実装と通信するために Android フレームワークがバインドするサービスとして実装されます。 ImsService を実装するアプリケーションをフレームワークに登録するには、3 つの手順が必要です。まず、アプリケーションのAndroidManifest.xml
を使用して、ImsService 実装をプラットフォームに登録する必要があります。次に、実装がサポートする IMS 機能 (MmTel または RCS) を定義する必要があります。第 3 に、キャリア構成またはデバイス オーバーレイのいずれかで、信頼できる 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 機能仕様
ImsService が AndroidManifest.xml で Android サービスとして定義された後、ImsService はサポートする IMS 機能を定義する必要があります。 Android は現在、MmTel および RCS 機能をサポートしていますが、MmTel のみがフレームワークに統合されています。フレームワークに統合された RCS API はありませんが、ImsService の機能として宣言することにはまだ利点があります。
以下は、ImsService が提供できるandroid.telephony.ims.ImsFeature
で定義された有効な機能と、IMS アプリケーションがこれらの機能の 1 つまたはすべてを実装する必要がある理由の説明と例です。各機能が定義された後、このページでは、 ImsService
が各 SIM スロットに対して定義する一連の機能を宣言する方法について概説します。
FEATURE_MMTEL
ImsService
は、緊急通報用の IMS PDN への緊急接続を除く、すべての IMS メディア (IR.92 および IR.94 仕様) のサポートを含む IMS MMTEL 機能を実装します。 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 に (安全に) バインドするようにプラットフォームを構成する必要があります。フレームワークがバインドする ImsServices には、次の 2 つのタイプがあります。
- Carrier "override" ImsService: これらの ImsService はデバイスにプリロードされていますが、1 つ以上の携帯電話会社に接続されており、一致する SIM カードが挿入されている場合にのみバインドされます。これは、
-
config_ims_mmtel_package_override_string
MMTEL 機能を実装する ImsServices の CarrierConfig キー。 - RCS 機能を実装する
config_ims_rcs_package_override_string
の config_ims_rcs_package_override_string。
-
- デバイスの "default" 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 を実装するアプリケーションは、MMTEL または RCS 機能のキャリア「オーバーライド」ImsService またはデバイス「デフォルト」ImsService 構成として構成されているデバイスにのみバインドされます。 ImsService では、 ImsService#onUpdateSupportedImsFeatures
メソッドを使用して更新を介して、サポートする IMS 機能 (MMTEL および RCS) を動的に有効または無効にすることもできます。これにより、フレームワークがトリガーされ、どの ImsService がバインドされ、どの機能がサポートされているかが再計算されます。 IMS アプリケーションがフレームワークを更新し、機能がサポートされていない場合、電話が再起動されるか、IMS アプリケーションと一致する新しい SIM カードが挿入されるまで、ImsService はバインドされません。
複数の ImsService のバインド優先度
フレームワークは、デバイスにプリロードされている可能性のあるすべての ImsService へのバインドをサポートできず、機能ごとに次の順序で SIM スロットごとに最大 2 つの ImsService (機能ごとに 1 つの ImsService) にバインドします。
- SIM カードが挿入されている場合、CarrierConfig 値
config_ims_[mmtel/rcs]_package_override_string
によって定義される ImsService パッケージ名。 - SIM カードが挿入されていない場合を含む
config_ims_[mmtel/rcs]_package
のデバイス オーバーレイ値で定義された ImsService パッケージ名。この ImsService は、緊急 MmTel 機能をサポートする必要があります。
上で定義したように、ImsService がデフォルトになる場合は、そのパッケージを使用するキャリアごとに CarrierConfig で定義された ImsService のパッケージ名、またはデバイス オーバーレイで定義された ImsService のパッケージ名が必要です。
これを機能ごとに分類してみましょう。シングル SIM カードがロードされたデバイス (シングルまたはマルチ SIM) の場合、MMTel と RCS の 2 つの IMS 機能が可能です。フレームワークは、機能ごとに上記で定義された順序でバインドを試みます。キャリア構成オーバーライドで定義された ImsService で機能が利用できない場合、フレームワークはデフォルトの ImsService にフォールバックします。たとえば、次の機能を備えたシステムに ImsServices を実装する 3 つの 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 以降を実行しているデバイスでは、関連付けられたサブスクリプションの ImsService インスタンスが使用可能かどうかを監視するために、アプリでImsStateCallback
クラスを使用できます。 ImsMmTelManager
またはImsRcsManager
のインスタンスを取得する場合、まずImsMmTelManager#registerImsStateCallback
またはImsRcsManager#registerImsStateCallback
registerImsStateCallback を使用して、アプリが IMS 状態コールバックに登録することをお勧めします。 ImsService が再び利用可能になったときに特定のサブスクリプションのコールバック更新を引き続き受け取るには、アプリはImsMmTelManager
、 ImsRcsManager
、またはProvisioningManager
を介して登録された既存のコールバックを登録解除または破棄する必要があります。新しいコールバックを登録します。
IMS をサポートしていないサブスクリプションがある場合、フレームワークは、理由REASON_NO_IMS_SERVICE_CONFIGURED
でImsStateCallback#onUnavailable
を呼び出します。これは、サブスクリプションで ImsService と IMS 関連の API を使用できないことを意味します。
万が一テレフォニー プロセスがクラッシュした場合、アプリはImsStateCallback#onError
を受け取り、登録されたImsStateCallback
インスタンスの更新を受け取りません。この状態から回復するには、 ImsMmTelManager#registerImsStateCallback
またはImsRcsManager#registerImsStateCallback
registerImsStateCallback を呼び出して、関連するサブスクリプションのImsStateCallback
インスタンスを再登録します。