Отправка 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.
Я не понимаю, что еще я мог попробовать. У кого-нибудь есть предложения?
Спасибо заранее,
Саймон.
Ответы
Ответ 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/...