サードパーティ通話アプリのサポート

Android 9 には、サードパーティ(3P)通話アプリのサポートを強化する API が用意されています。3P 通話アプリは通常、PHONE_STATE ブロードキャストなどのテレフォニー API を利用してキャリア通話と共存します。この結果、3P 通話アプリはキャリア通話を優先してアプリでの着信を拒否したり、通話を途中で終了したりする必要があります。

Android 9 の API は、3P アプリ通話とキャリア通話を同時に行うシナリオをサポートしています。これにより、たとえばキャリア通話中に 3P 通話を受信できます。フレームワークは、ユーザーが 3P 通話を行っているときにキャリア通話を保留にしておく必要があります。

Android 9 では、3P 通話アプリに自己管理 ConnectionService API を実装することをおすすめします。この API を使用して通話アプリをビルドする方法について詳しくは、通話アプリを作成するをご覧ください。

自己管理 ConnectionService API を使用すると、デベロッパーはアプリでの通話がシステム通話履歴に記録されるように設定することもできます(EXTRA_LOG_SELF_MANAGED_CALLS を参照)。Android 互換性定義ドキュメント(CDD)の 7.4.1.2 条の要件どおり、電話アプリまたは通話アプリに通話履歴エントリが表示され、通話の発信元である 3P 通話アプリの名前が表示されていることを確認してください(AOSP 電話アプリでこの要件を満たす方法については、3P 通話アプリの通話履歴エントリをご覧ください)。

アプリの接続に対する CAPABILITY_SUPPORT_HOLDCAPABILITY_HOLD の設定はアプリで行います。ただし、状況によってはアプリで通話を保留できない場合もあります。フレームワークには、こうしたケースを解決するための規定があります。

シナリオ

次のシナリオに対応できるように電話アプリを変更してください。

進行中の通話を切断する着信通話の処理

保留に対応していない 3P 通話(SuperCaller 通話など)中に携帯通信会社を介したモバイル通話を着信した場合、電話アプリまたは通話アプリは、モバイル ネットワーク通話に応答すると進行中の 3P 通話が終了することをユーザーに知らせる必要があります。

3P 通話アプリではフレームワークで保留できない通話が行われる場合があるため、このユーザー エクスペリエンスは重要です。新しいモバイル通話に応答すると、進行中の 3P 通話は切断されます。

以下のユーザー インターフェースの例をご覧ください。

3P 通話を切断する着信通話
図 1. 進行中の 3P 通話を切断する着信通話

電話アプリでは、着信通話によって別の通話が切断されるかどうかを通話の EXTRA によって確認できます。EXTRA_ANSWERING_DROPS_FG_CALLTRUE に設定され、モバイル通話に応答した場合に通話が切断されるアプリの名前が EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME に設定されていることを確認してください。

3P 通話アプリの通話履歴エントリ

3P 通話アプリのデベロッパーは、アプリでの通話がシステム通話履歴に記録されるように設定できます(EXTRA_LOG_SELF_MANAGED_CALLS を参照)。つまり、通話履歴にモバイル ネットワーク通話以外のエントリを含めることができます。

AOSP の電話アプリに 3P 通話アプリに関連する通話履歴エントリが表示される場合は、以下に示すように通話が行われたアプリの名前が表示されます。

3P 通話アプリの通話履歴エントリ
図 2. 電話アプリに表示された 3P 通話アプリの名前を含む通話履歴エントリ

通話履歴エントリに関連付けられたアプリの名前を確認するには、通話履歴プロバイダの PHONE_ACCOUNT_COMPONENT_NAME 列と PHONE_ACCOUNT_ID 列を使用して、通話履歴エントリのソースを識別する PhoneAccountHandle のインスタンスを作成します。TelecomManager に対してクエリを行い、PhoneAccount の詳細を取得します。
通話履歴エントリが 3P 通話アプリのものかどうかを特定するには、PhoneAccount の機能CAPABILITY_SELF_MANAGED が設定されているかどうかを確認します。

返された PhoneAccountgetLabel メソッドによって、3P 通話アプリの通話履歴エントリに関連付けられているアプリの名前が返されます。

検証

デバイスによる 3P 通話アプリのサポートをテストするには、自己管理 ConnectionService API を実装する通信テストアプリを使用します。このアプリは /packages/services/Telecomm/testapps/ にあります。

  1. 以下を使用して、Android ソース リポジトリのルートからテストアプリをビルドします。

    mmma packages/services/Telecomm/testapps/

  2. adb install -g -r <apk path> を使用してビルド APK をインストールします。Self-Managed Sample アイコンがランチャーに追加されます。

  3. アイコンをタップしてテストアプリを開きます。

進行中の通話を切断する着信通話の処理

進行中の 3P 通話が着信通話によって切断されることを確認する手順は次のとおりです。

3P 通話アプリ用のテストアプリ
図 3. 自己管理 ConnectionService API のサンプル実装を含むテストアプリ
  1. [Holdable] チェックボックスをオフにします。
  2. [OUTGOING] をタップして新しいサンプル発信を開始します。
  3. [ACTIVE] ボタンをタップして通話をアクティブにします。
  4. 別のスマートフォンを使用してテスト対象のデバイスの電話番号を発信します。通話が切断されるアプリの名前が電話アプリに表示されます。
  5. 完了したら、テストアプリの [DISCONNECT] ボタンをタップします。

3P 通話アプリの通話履歴エントリ

上の手順を完了すると、テストアプリによって通話がシステム通話履歴に記録されます。3P 通話アプリでの通話がデバイスのログに記録されることを確かめるには、電話アプリを開いてシステム通話履歴に表示される通話を確認します。