24

アクティブな通話中にアプリが音声のアップリンク周波数で DTMF トーンを送信できるようにする必要があるプロジェクトに取り組んでいます。

私の2つの条件は次のとおりです。

  • カスタマイズされた Android プラットフォームは使用しません
  • 電話をルート化する必要はありません

宿題をするのに数日を費やしましたが、インコール DTMF 送信が現在の SDK/標準 API でサポートされていないことを認識しています。ただし、関連するクラスを使用するcom.android.internal.telephonyことで、ネイティブの電話アプリがこれを行う方法を模倣したいと考えています。標準のサードパーティ アプリに内部 API を使用する方法について、このサイトをフォローしました。

また、Android OS 開発環境をセットアップし、エミュレーターで電話アプリをデバッグ モードで実行して、内部の仕組みを理解することができました。

ストック標準エミュレーターでさまざまな方法を試しましたが、発生したエラーは次のとおりです。

  1. android.uid.phone の sharedUserId を使用して、Phone.apk のソースに基づいて名前を変更したアプリをインストールしようとした後、次のようになりました。

    インストール エラー: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

    署名するためのシステム証明書がないため、間違いありません。

  2. Phone.apk のソースからコードを送信する関連する DTMF トーンに基づいてカスタム アプリを作成しようとすると、PhoneFactory のセットアップ時に次のエラーが発生します。

    java.lang.SecurityException: Permission Denial: ブロードキャスト android.provider.Telephony.SPN_STRINGS_UPDATED の送信が許可されていません。

    AndroidManifest.xml は Phone.apk と同じ権限で設定されていますが、私のアプリには適切な権限がないため、間違いありません。

他に何を試すことができるか途方に暮れています。誰か提案はありますか?

前もって感謝します、サイモン。

4

3 に答える 3

11

あなたは興味深いアプローチをとっており、私はあなたの努力を称賛します。残念ながら、アプリ開発者として使用することを許可されていない予約済みの内部特権 (明らかに などSPN_STRINGS_UPDATED) がいくつかあり、多かれ少なかれこのアプローチを破っています。これを引き起こしているコードの領域を削除することもできますが、ブロッキングの問題が発生することは間違いありません。

したがって、現時点ではこれは不可能だと思います。Androidでは、既存の通話で DTMF トーンを送信するための機能リクエストが公開されていますが、2 年近く休止状態になっています。

これで問題が解決しないことは理解していますが、番号をダイヤルした直後に DTMF トーンを送信できることに注意してください。

Intent i = new Intent("android.intent.action.CALL",
                      Uri.parse("tel://" + number + "," + dtmfTones));
于 2011-07-05T09:58:42.653 に答える
6

簡単に言えば、少なくとも電話アプリをカスタマイズしないと、モデムにアクセスするためにシステム ユーザーとして実行する必要があります。これを行うには、電話をルート化する必要があります。

要件を満たす唯一の解決策は、Android プラットフォームを強化することです。まさにそれを行い、すでにパッチを AOSP プロジェクトに送信しました。

https://android-review.googlesource.com/32820

https://android-review.googlesource.com/32821

私たちは現在、Google の開発者が私たちの貢献をレビューして受け入れるのを待っています。興味がある場合は、さまざまな AOSP リスト (android-contrib、android-platform) で Google にお知らせください。審査が早くなることが期待されます。

よろしくお願いします、Gergely

于 2012-05-17T19:02:07.233 に答える
1

アクティブな通話中に DTMF トーンを送信することはできませんが、通話を開始するときに「プログラム」すると送信できます。次の投稿を参照してください: https://stackoverflow.com/a/12986066/475472

于 2012-10-20T07:00:48.140 に答える