Подтвердить что ты не робот

Отправка DTMF-сигналов по входящему вызову

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

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

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

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

Я также настроился на среду ОС Android OS и могу запустить приложение "Телефон" в режиме отладки на эмуляторе, чтобы понять его внутреннюю работу.

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Intent i = new Intent("android.intent.action.CALL",
                      Uri.parse("tel://" + number + "," + dtmfTones));

Ответ 2

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

Для удовлетворения ваших требований единственным возможным решением является расширение платформы Android. Мы сделали именно это и уже отправили наши исправления в проект AOSP:

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

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

В настоящее время мы ожидаем, что разработчики Google рассмотрят и примут наш вклад. Если вы заинтересованы, сообщите Google в различных списках AOSP (Android-Contrib, Android-платформа). Он, надеюсь, ускорит обзор.

С наилучшими пожеланиями, Gergely

Ответ 3

Вы не можете отправлять тональные сигналы DTMF во время активного вызова, но вы можете отправлять их, когда вы "программируете" их при инициировании вызова. см. следующее сообщение: fooobar.com/info/270587/...