くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Android7.xで電話・通話の自動応答できるようにするまで

Androidはバージョンが上がるごとにセキュリティ対策が進み、利用できなくなるAPIがある。
電話の自動応答もその一つで。数少ない情報も使えない場合が多い。

調べてやってみたこと

  1. ITelephonyを使って、acceptCall()を実行する(The internal ITelephony.aidl method)
  2. HeadSetの応答ボタンをエミュレート(The Headset KeyCode Intent Method)
  3. 内部のshellからinput keyeventを送信(Run input keyevent Method)

    • Android7.xから使えないらしい。Android6.x(Marshmallow)まではOK
  4. Telecom Frameworkを使う

Telecom Frameworkとは

公式の説明では、こんな感じ。

Android Telecom Frameworkは、Androidバイスでの音声通話とビデオ通話を管理します。 これには、ConnectionService APIの実装者が提供するVOIPコールだけでなく、 SIMベースのコール(テレフォニーフレームワークなど)も含まれます。

なるほど、通話の管理に対するフレームワークらしい。 更に読み進めると。

Telecomが扱う主な2つのコンポーネントは、ConnectionServicesとInCallServicesです。

ConnectionService実装は、何らかの手段(例えば、VOIP)を使用して別のパーティにコールを接続する役割を担います。 電話で最も一般的なConnectionServiceの実装は、キャリア呼び出しの接続を担当するTelephony ConnectionServiceです。

InCallService実装は、Telecomが管理する呼び出しにユーザーインターフェイスを提供し、ユーザーにこれらの呼び出しを制御したり操作したりする手段を提供します。 デバイスにバンドルされている電話アプリは、InCallServiceの実装の最も一般的な例です。

Telecomは、ConnectionService実装によって提供される呼び出しを、InCallService実装によって提供される呼び出し側ユーザーインターフェイスにルーティングする、スイッチボードとして機能します。

なにやら、2パターンあるらしい。

1, システムの電話アプリの代替品を作成したい 2. Androidの通話体験に統合された呼び出しソリューションを作成したい

うん。むずかしい。。。

1. Creating a Replacement Phone App(電話アプリを作りたい)

電話アプリを作りたいときは、InCallServiceを使えということらしい。

Android端末で標準のの電話アプリの代わりを作成する場合は、InCallService APIを実装します。

InCallServiceには呼び出し機能がなく、呼び出しのためのユーザーインターフェイスのみで構成されている必要があります。InCallServiceは、テレコムフレームワークが認識しているすべてのコールを処理する必要があります。

通話の性質(例えば、通話がSIMベースの電話通話であると仮定して)を想定してはいけません。また、ConnectionServiceに基づいて通話制限を実装してはいけません。

詳細については、「InCallService」を参照してください。

2. Integrating a Calling Solution(通話ソリューションをインテグレートしたい)

電話アプリではなく、通話をむにゃむにゃしたいときには、ConnectionServicesを使うらしい

呼び出し元のソリューションをAndroidに統合する場合は、次のオプションがあります。

2-1 Implement the self-managed ConnectionService API(全部自分で管理する)

これは、既定の電話アプリ内で自分の通話を表示したくないスタンドアロン通話アプリケーションの開発者にとって、またユーザーインターフェイスに他の通話を表示したくない場合に最適です。

従来、スタンドアロンの通話アプリケーションは、電話状態を聞いて他の通話がいつ行われているかを判断しようとしていました。

これは、電話機の状態が、ユーザがインストールした可能性のある他の通話アプリを考慮に入れていないため、問題である。

自己管理されたConnectionServiceを使用すると、デバイスでのネイティブテレフォニーコールだけでなく、このAPIを実装する他のスタンドアロンのコールアプリとの相互運用性を保証することができます。

セルフマネージドConnectionService APIは、オーディオルーティングとフォーカスも管理します。 詳細については、「自己管理接続サービス」を参照してください。

2-2 Implement the managed ConnectionService API(管理されたConnectionService APIを使う)

既存のデバイス電話アプリケーション(getDefaultDialerPackage()を参照)を使用して呼び出しのためのユーザーインターフェイスを提供する呼び出しソリューションの開発を容易にします。

例として、SIP通話の第三者実装、またはVOIP通話サービスがあります。

ConnectionServiceだけでは、コールの接続方法のみが提供されますが、関連付けられたユーザーインターフェイスはありません。

詳細については、ConnectionServiceを参照してください。

2-3 Implement both the InCallService and ConnectionService API(どっちも使う)

独自のConnectionServiceベースの呼び出しソリューションを独自のユーザーインターフェイスで作成し、同じユーザーインターフェイスで他のすべてのAndroid呼び出しを表示する場合に最適です。

この方法を使用する場合でも、InCallServiceが表示する呼び出しのソースについては想定しないでください。

カスタムのInCallServiceにデフォルトの電話アプリが設定されていなくても、ConnectionServiceの実装が機能していることを確認する必要があります。

InCallServiceを使ってみる

InCallService | Android Developersを見てみた。

このサービスは、電話を管理するためのユーザーインターフェイスを提供したいすべてのアプリによって実装されています。 Telecomは、ライブ(アクティブまたは着信)通話が存在している間にこのサービスにバインドし、通話中のアプリと最近切断された通話をインコールアプリに通知するために使用します。 テレコムサービスがInCallService実装にバインドされる前に、まずアプリケーションをデフォルトの電話アプリとして設定する必要があります(getDefaultDialerPackage()を参照)。

以下は、InCallServiceのマニフェスト登録の例です。 metadata(METADATA_IN_CALL_SERVICE_UI)は、この特定のInCallService実装が、組み込みのコールインUIを置き換えることを示しています。

UIは標準の電話アプリに任せて、それ以外の部分を操作できるよう。

参考にしたサイト様

昔の解決策の参考サイト様

公式サイトのReferencesたち

Telecom関連の参考サイト様

ConnectionService関連の参考サイト様

InCallService関連の参考サイト様

電話アプリ関連の参考サイト様