萌えハッカーニュースリーダー

2025/06/06 11:29 How to (actually) send DTMF on Android without being the default call app

出典: https://edm115.dev/blog/2025/01/22/how-to-send-dtmf-on-android
hakase
博士

ロボ子、今回のITニュースはAndroidアプリでDTMF信号を送信する機能の実装についてじゃ。

roboko
ロボ子

DTMF信号ですか。電話のプッシュ音のことですね。

hakase
博士

そうじゃ。LifeCompanionというデジタルアシスタントに、Androidスマホとの連携機能を追加するプロジェクトで、DTMF送信機能が既存の通話プラグインに無かったからの。

roboko
ロボ子

なるほど。でも、Androidの公式APIでは、デフォルトの通話アプリとして登録しないとDTMF送信ができないんですね。

hakase
博士

`android.telecom.Call`クラスの`playDtmfTone()`メソッドを使うには、`android.telecom.InCallService`を拡張して、デフォルトの通話アプリになる必要があるからの。これはちょっと大変じゃ。

roboko
ロボ子

それで、どうしたんですか?

hakase
博士

そこで、Accessibility Serviceの登場じゃ!画面上のキーパッドボタンをエミュレートするという荒技に出たぞ。

roboko
ロボ子

Accessibility Serviceですか。画面のコンテンツ変化やViewのクリックをトリガーに動作する機能ですね。

hakase
博士

その通り!`DTMFAccessibilityService`というシングルトンを実装して、通話アプリのパッケージ名をリスト化し、`onAccessibilityEvent()`で通話画面を監視するのじゃ。

roboko
ロボ子

`isInCallScreen()`で通話画面かどうかを判定して、`openDialPadIfNeeded()`でキーパッドを開き、`pressKeyDigit()`でDTMFに対応するボタンをクリックするんですね。

hakase
博士

さすがロボ子、理解が早い!BFS(幅優先探索)でキーパッドボタンを探すのがミソじゃ。

roboko
ロボ子

`CallService`から`DTMFAccessibilityService`の`pressKeypadButton()`を呼び出してDTMFを送信するんですね。でも、Accessibility Serviceの権限をユーザーに要求する必要がありますね。

hakase
博士

そうじゃな。そして、キーパッドボタンの国際化対応や通話アプリ名の検出、キーパッド要素の可視性検出など、改善点もいくつかあるぞ。

roboko
ロボ子

標準APIがないから、Accessibility Serviceを利用してDTMF送信をエミュレートするのは、確かに複雑ですが、有効な解決策ですね。

hakase
博士

じゃろ?しかし、Accessibility Serviceを悪用して、画面上の情報を盗み取る輩もいるから、注意が必要じゃぞ!

roboko
ロボ子

そうですね。セキュリティには常に気を配る必要がありますね。

hakase
博士

ところでロボ子、Accessibility Serviceを使って、私の部屋の掃除を自動化できないかの?

roboko
ロボ子

それはちょっと難しいかもしれませんね。まずは博士の研究室の整理整頓から始めましょうか?

hakase
博士

むむ、それは耳が痛い…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search