Android 9 には、サードパーティ通話アプリのサポートを強化する API が用意されています。サードパーティ通話アプリは通常、PHONE_STATE
ブロードキャストなどのテレフォニー API を利用してキャリア通話と共存します。この結果、サードパーティ通話アプリはキャリア通話を優先してアプリでの着信を拒否したり、通話を途中で終了したりする必要があります。
Android 9 の API は、サードパーティ アプリ通話とキャリア通話を同時に行うシナリオをサポートしています。これにより、たとえばキャリア通話中にサードパーティ通話を受信できます。フレームワークは、ユーザーがサードパーティ通話を行っているときにキャリア通話を保留にしておく必要があります。
Android 9 では、サードパーティ通話アプリに自己管理 ConnectionService
API を実装することをおすすめします。この API を使用して通話アプリをビルドする方法について詳しくは、通話アプリを作成するをご覧ください。
自己管理 ConnectionService
API を使用すると、デベロッパーはアプリでの通話がシステム通話履歴に記録されるように設定することもできます(EXTRA_LOG_SELF_MANAGED_CALLS
を参照)。Android 互換性定義ドキュメント(CDD)の 7.4.1.2 条の要件どおり、電話アプリまたは通話アプリに通話履歴エントリが表示され、通話の発信元であるサードパーティ通話アプリの名前が表示されていることを確認してください(AOSP 電話アプリでこの要件を満たす方法については、サードパーティ通話アプリの通話履歴エントリをご覧ください)。
アプリの接続に対する CAPABILITY_SUPPORT_HOLD
と CAPABILITY_HOLD
の設定はアプリで行います。ただし、状況によってはアプリで通話を保留できない場合もあります。フレームワークには、こうしたケースを解決するための規定があります。
シナリオ
次のシナリオに対応できるように電話アプリを変更してください。
進行中の通話を切断する着信通話を処理する
保留に対応していないサードパーティ通話(SuperCaller 通話など)中に携帯通信会社を介したモバイル通話を着信した場合、電話アプリまたは通話アプリは、モバイル ネットワーク通話に応答すると進行中のサードパーティ通話が終了することをユーザーに知らせる必要があります。
サードパーティ通話アプリではフレームワークで保留できない通話が行われる場合があるため、このユーザー エクスペリエンスは重要です。新しいモバイル通話に応答すると、進行中のサードパーティ通話は切断されます。
下図のユーザー インターフェースの例をご覧ください。
図 1. サードパーティ通話を切断する着信通話
電話アプリでは、着信通話によって別の通話が切断されるかどうかを通話の EXTRA によって確認できます。EXTRA_ANSWERING_DROPS_FG_CALL
が TRUE
に設定され、モバイル通話に応答した場合に通話が切断されるアプリの名前が EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME
に設定されていることを確認してください。
サードパーティ通話アプリの通話履歴エントリ
サードパーティ通話アプリのデベロッパーは、アプリでの通話がシステム通話履歴に記録されるように設定できます(EXTRA_LOG_SELF_MANAGED_CALLS
を参照)。つまり、通話履歴にモバイル ネットワーク通話以外のエントリを含めることができます。
AOSP の電話アプリにサードパーティ通話アプリに関連する通話履歴エントリが表示される場合は、下図に示すように通話が行われたアプリの名前が表示されます。
図 2. 電話アプリに表示されたサードパーティ通話アプリの名前を含む通話履歴エントリ
通話履歴エントリに関連付けられたアプリの名前を確認するには、通話履歴プロバイダの PHONE_ACCOUNT_COMPONENT_NAME
列と PHONE_ACCOUNT_ID
列を使用して、通話履歴エントリのソースを識別する PhoneAccountHandle
のインスタンスを作成します。TelecomManager
に対してクエリを行い、PhoneAccount の詳細を取得します。
通話履歴エントリがサードパーティ通話アプリのものかどうかを特定するには、PhoneAccount
の機能で CAPABILITY_SELF_MANAGED
が設定されているかどうかを確認します。
返された PhoneAccount
の getLabel
メソッドによって、サードパーティ通話アプリの通話履歴エントリに関連付けられているアプリの名前が返されます。
検証
デバイスによるサードパーティ通話アプリのサポートをテストするには、自己管理 ConnectionService API を実装する通信テストアプリを使用します。このアプリは /packages/services/Telecomm/testapps/
にあります。
以下を使用して、Android ソース リポジトリのルートからテストアプリをビルドします。
mmma packages/services/Telecomm/testapps/
adb install -g -r <apk path>
を使用してビルド APK をインストールします。Self-Managed Sample アイコンがランチャーに追加されます。アイコンをタップしてテストアプリを開きます。
進行中の通話を切断する着信通話を処理する
進行中のサードパーティ通話が着信通話によって切断されることを確認する手順は次のとおりです。
図 3. ConnectionService API のサンプル実装を含むテストアプリ
- [Holdable] チェックボックスをオフにします。
- [OUTGOING] をタップして新しいサンプル発信を開始します。
- [ACTIVE] ボタンをタップして通話をアクティブにします。
- 別のスマートフォンを使用してテスト対象のデバイスの電話番号を発信します。通話が切断されるアプリの名前が電話アプリに表示されます。
- 完了したら、テストアプリの [DISCONNECT] ボタンをタップします。
サードパーティ通話アプリの通話履歴エントリ
上の手順を完了すると、テストアプリによって通話がシステム通話履歴に記録されます。サードパーティ通話アプリでの通話がデバイスのログに記録されることを確かめるには、電話アプリを開いてシステム通話履歴に表示される通話を確認します。