Ответ 1
Набор кода USSD из пользовательского действия выполняется прямо с использованием намерения DIAL или CALL, но прослушивание полученного результата не связано с тем, что Android не имеет надлежащей поддержки для перехвата вызовов USSD внутри платформы, но частичная, хотя и недокументированная поддержка существует внутри родного дозвонщик.
Для начала рассмотрим класс PhoneUtils в исходном коде Android. Ссылка для 4.0.3, но я считаю, что эта частичная поддержка присутствует с 2.3.
В частности, глядя на строку 217, создается намерение с именем "com.android.ussd.IExtendedNetworkService". Итак, что вам нужно сделать, это реализовать свой собственный сервис, который отвечает на это намерение. Сервис должен быть реализован в соответствии с IExtendedNetworkService.aidl, который является частью платформы Android.
Helpl предоставляет несколько функций, но тот, о котором мы заботимся, это функция getUserMessage (text) в этой службе. Текст является окончательным значением, возвращаемым вызовом USSD.
Заметки:
- Поскольку услуга привязана к PhoneUtils, вам необходимо запустить службу при загрузке телефона. Это также означает, что для любой модификации услуги потребуется перезагрузка телефона.
- Возврат null из getUserMessage будет подавлять дозвонщик, показывая результат USSD, но не может полностью скрывать дозвонщик.
- Вы также можете использовать другие функции для изменения отображаемого текста во время разговора.
- Кажется, что это не работает в USSD-подсказках (меню), только по окончательным результатам.
Оформить пример кода на github здесь.