web-dev-qa-db-ja.com

Android.telecomおよびInCallServiceを使用して着信に応答する

API 21以降、Googleは一般的に Android.telecom に機能を追加しています。特に TelecomManager のより多くのメンバーと InCallService の追加を実装しています。この最後のものは、システム以外のサードパーティアプリがシステムの機能を提供および置換できるようにすることになっています。アプリ呼び出し中画面-ポップアップし、EXTRA_STATE_OFFHOOKまたはEXTRA_STATE_RINGINGブロードキャスト(つまり、電話の着信と発信)。

現在、この画面のみが、ルート制限されたMODIFY_PHONE_STATE許可と、リフレクションでアクセスすることさえできない多くの保護されたAOSPコード。特に、異なるメーカーの最も変更されたコードの1つですROMフレーバーと、ランチャー、連絡先、カメラ。

これはすべて非常にきれいですが...

サードパーティのInCallServiceを実際にどのように開発していますか?

すなわち:

  1. GSMコールのインスタンスの通知方法と取得方法
  2. これらの呼び出しにどのように応答しますか
  3. このクラスのコールバックのライフサイクルは何ですか
  4. Googleはこれについて実際のチュートリアルを提供していますか?

私はこれらのすべてに一度に答えを求めることはしませんが、いずれかの答えはおそらく他の質問に関連しています。これは広範ですが、本質的には必要です。AOSPコード以外につまずいたWebの例はありません。そのコードは、ルート特権の前提に基づいているため、サードパーティのアプリ開発には使用できません。目的。

16
leRobot

GSMコールのインスタンスの通知方法と取得方法

まず、ユーザーはアプリをデフォルトの電話アプリとして選択する必要があります。 デフォルトの電話アプリをAndroid 6および7でInCallServiceに置き換える を参照してください。

また、システムがバインドして呼び出しについて通知する InCallService 実装を定義する必要があります。

_<service
    Android:name=".CallService"
    Android:permission="Android.permission.BIND_INCALL_SERVICE">
    <meta-data
        Android:name="Android.telecom.IN_CALL_SERVICE_UI"
        Android:value="true" />
    <intent-filter>
        <action Android:name="Android.telecom.InCallService" />
    </intent-filter>
</service>
_

そこで、少なくとも onCallAddedCallでリスナーを設定し、呼び出しのためにUI-アクティビティ-を開始)と onCallRemoved (リスナーを削除)。

これらの呼び出しにどのように応答しますか

ユーザーが呼び出しに応答したい場合、メソッド Call#answer(int) with _VideoProfile.STATE_AUDIO_ONLY_ を呼び出す必要があります。

このクラスのコールバックのライフサイクルは何ですか

_Call.Callback_ をチェックして、1回の呼び出しで発生する可能性のあるイベントを確認してください。

Googleはこれについて実際のチュートリアルを提供していますか?

Googleについては知りませんが、簡単な例を確認できます https://github.com/arekolek/simple-phone

6
arekolek

call appの置換 の2番目のコメントからのアドバイスに従ってください。さらに、InCallServiceインターフェースを実装するサービスが必要です。呼び出しが到着すると、onCallAdded(Call call)メソッドが呼び出され、呼び出しオブジェクトへの参照が提供されます。

<service
  Android:name=".InCallServiceImplementation"
  Android:enabled="true"
  Android:exported="true"
  Android:permission="Android.permission.BIND_INCALL_SERVICE">

  <meta-data
    Android:name="Android.telecom.IN_CALL_SERVICE_UI"
    Android:value="true" />

  <intent-filter>
    <action Android:name="Android.telecom.InCallService" />
  </intent-filter>
</service>

呼び出しオブジェクトを取得したら、その応答はcall.answer()と同じくらい簡単です。上記のものが機能するようになったら、いくつかのテストコールを実行して、異なるコールバックがいつ呼び出されるかを確認することをお勧めします。

チュートリアルに関しては、これを調べていたときに何も見つかりませんでしたが、それは1年以上前でした...

お役に立てれば!

5
user5806139

どうやらAndroid 8、最終的に新しい許可 サードパーティの開発者向け許可を介した呼び出しへの応答を許可

Android.permission。ANSWER_PHONE_CALLS(...)は、アプリが着信電話に応答できるようにしますプログラムで

ただし、API 26のドキュメントはまだリリースされていないため、詳細はまだありません。彼らがそうするとき、私は必ずこの答えを更新します。

編集:ユーザーarekolekは、この質問の元のAPIバージョンで完全に動作する答えを提供しました(尋ねた時点では、APIは23でしたが、質問はAPI 21)に言及しているため、彼は正しい答えを得ることができます。 23以上のSDKを対象とする呼び出し画面を実装する場合は、彼の答えを参照してください。使用を非推奨(または制限)する最新のAPIで動作させるには、API依存コードまたは互換ライブラリの調整が必要になる場合がありますサンプルコードを提供しました。 githubリポジトリは、当初意図したとおりに機能します。

3
leRobot