Отправка тонов DTMF через входящий вызов - PullRequest
21 голосов
/ 14 июня 2011

Я работаю над проектом, который требует, чтобы мое приложение могло отправлять тоны DTMF на частоте восходящей линии голоса во время активного вызова.

Мои 2 условия:

  • Мы не используем настроенную платформу Android
  • Нам не нужно рутировать телефон

Я провел несколько дней, выполняя домашнюю работу, и знаю, что во время разговораОтправка DTMF не поддерживается текущими SDK / стандартными API.Однако, используя соответствующие классы в com.android.internal.telephony, я надеюсь подражать тому, как это делает родное приложение Phone.Я следил за этим сайтом о том, как использовать внутренние API-интерфейсы для стандартных сторонних приложений .

Я также настроил среду разработки Android OS и могу запускать приложение Phone вРежим отладки на эмуляторе для определения его внутренней работы.

Я пробовал различные способы на стандартном стандартном эмуляторе, но я получил следующие ошибки:

  1. После попытки установитьпереименованное приложение, основанное на источнике Phone.apk с использованием sharedUserId android.uid.phone, получило:

    Ошибка установки: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

    Без сомнения, из-за того, что яУ меня нет сертификата системы для его подписи.

  2. После попытки написать собственное приложение на основе соответствующего кода отправки тонального сигнала DTMF из источника Phone.apk, я получаю следующую ошибку:настройка PhoneFactory;

    java.lang.SecurityException: Отказ в разрешении: запрещено отправлять трансляции android.provider.Telephony.SPN_STRINGS_UPDATED.

    Без сомнения, из-за того, что мое приложение не имеет необходимых разрешений, хотя AndroidManifest.xml настроен с теми же разрешениями, что и Phone.apk.

Я в растерянностичто еще можно попробовать.У кого-нибудь есть предложения?

Заранее спасибо, Саймон.

Ответы [ 3 ]

10 голосов
/ 05 июля 2011

Вы выбрали интересный подход, и я высоко оцениваю ваши усилия.К сожалению, есть некоторые зарезервированные внутренние привилегии (очевидно, такие как SPN_STRINGS_UPDATED), которые вы не можете использовать в качестве разработчика приложений, что более или менее нарушает этот подход.Вы можете попробовать удалить область кода, вызывающую это, но я вполне уверен, что вы столкнетесь с проблемой блокировки.

Следовательно, я боюсь, что в данный момент это невозможно. есть открытый запрос на Android для отправки тонов DTMF по существующему телефонному звонку, но он там не используется почти два года.

Я понимаю, что это не решит вашу проблему, но учтите, что вы можете отправлять тональные сигналы DTMF непосредственно после набора номера:

Intent i = new Intent("android.intent.action.CALL",
                      Uri.parse("tel://" + number + "," + dtmfTones));
6 голосов
/ 17 мая 2012

Проще говоря, вы не сможете сделать это, не настроив хотя бы приложение Phone, которое должно запускаться от имени пользователя системы для доступа к модему.Для этого вам нужно получить root права на свой телефон.

Чтобы удовлетворить ваши требования, единственно возможное решение - улучшить платформу Android.Мы сделали именно это и уже отправили наши патчи в проект AOSP:

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

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

В настоящее время мы ожидаем, что разработчики Google рассмотрят и примут наш вклад.Если вы заинтересованы, пожалуйста, сообщите Google о различных списках AOSP (android-contrib, android-platform).Надеемся, что это ускорит обзор.

С наилучшими пожеланиями, Гергели

1 голос
/ 20 октября 2012

Вы не можете отправлять тональные сигналы DTMF во время активного вызова, но вы можете отправлять их, когда вы «программируете» их, когда инициируете вызов.см. следующий пост: https://stackoverflow.com/a/12986066/475472

...