Отправка USSD-кода с буквенными символами

В моем приложении для Android я отправляю коды USSD (#144#73#), используя ниже Intent :

String baseUssd = Uri.encode("#") + "144" + Uri.encode("#");
StringBuilder builder = new StringBuilder();
builder.append(baseUssd);
builder.append("73");
builder.append(Uri.encode("#"));

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + builder.toString()));

Это работает хорошо.

Теперь я хочу отправить этот код:

#144#73MA#

Я запускаю это с помощью панели набора номера, следуя USSD-меню оператора, и это сработало. Но если я попытаюсь сделать это программно, используя Intent выше, это не сработает.

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

Любая идея, пожалуйста!

Изменить

Когда я пытаюсь отправить это программно: #144#73MA#, я заметил, что приложение номеронабирателя изменяет буквенные символы на соответствующие им цифры на панели набора номера. Это означает, что номеронабиратель преобразует это: #144#73MA#

этому #144#7362# : почему?

Потому что :

  • M соответствует цифре 6
  • A соответствует цифре 2

person S.Thiongane    schedule 01.04.2014    source источник
comment
использование вышеуказанного намерения, которое не сработало --- Пожалуйста, укажите, как именно это не сработало.   -  person ozbek    schedule 08.04.2014
comment
Спасибо @shoerat, рад видеть ваш комментарий! Позвольте мне отредактировать мой ответ.   -  person S.Thiongane    schedule 08.04.2014
comment
Вы нашли решение этой проблемы?   -  person Harindaka    schedule 17.12.2018


Ответы (1)


Это означает, что номеронабиратель преобразует это: #144#73MA#

этому #144#7362# : почему?

Я постараюсь ответить только на часть почему.

Intent.ACTION_CALL обрабатывается OutgoingCallBroadcaster класс. Если вы посмотрите на метод processIntent(), то увидите этот фрагмент кода (строки 438~448 на момент написания этой статьи):

String number = PhoneNumberUtils.getNumberFromIntent(intent, this);
// Check the number, don't convert for sip uri
// TODO put uriNumber under PhoneNumberUtils
if (number != null) {
    if (!PhoneNumberUtils.isUriNumber(number)) {
        number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
        number = PhoneNumberUtils.stripSeparators(number);
    }
} else {
    Log.w(TAG, "The number obtained from Intent is null.");
}

Там PhoneNumberUtils.convertKeypadLettersToDigits() преобразует буквы в эквивалентные числовые цифры:

общедоступная статическая строка convertKeypadLettersToDigits (строковый ввод)

Преобразует любые буквы алфавита (например, [A-Za-z]) в указанном телефонном номере в эквивалентные цифровые цифры в соответствии с сопоставлением букв клавиатуры телефона, описанным в ITU E.161 и ISO/IEC 9995-8.

Возвращает
входную строку, в которой буквенные буквы преобразуются в числовые с помощью сопоставления букв на клавиатуре телефона. Например, ввод «1-800-GOOG-411» вернет «1-800-4664-411».

Надеюсь это поможет.

person ozbek    schedule 08.04.2014
comment
Спасибо, это очень полезно! Но скажите, пожалуйста, можно ли изменить это поведение? переопределив метод OutgoingCallBroadcaster или что-то в этом роде?! - person S.Thiongane; 08.04.2014
comment
Я не понимаю, как этого можно было бы достичь, если бы вы не могли использовать другие специальные символы вместо букв алфавита; например, ~& вместо MA - person ozbek; 08.04.2014
comment
К сожалению, я не могу. Я делаю приложение для использования USSD-кодов операторов. Я не могу изменить коды! - person S.Thiongane; 08.04.2014