Как отправить код USSD, содержащий десятичную плавающую точку (.)?

Мне нужно отправить USSD-код, содержащий двойное значение, которое представляет сумму счета баланса, которую нужно передать. Это значение состоит из целочисленного числа и необязательно десятичного разделителя и еще двух цифр. Мой код выглядит следующим образом:

    double doubleValue = 0.70;
    String phoneNumber = "51234567", pincode = "1234";
    String ast = Uri.encode("*");
    String baseUssd = ast + "234" + ast + "1" + ast + phoneNumber + ast + pincode + ast;
    StringBuilder builder = new StringBuilder();
    builder.append(baseUssd);
    builder.append(doubleValue); //i.e: 1.35, 0.80
    builder.append(Uri.encode("#"));
    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + builder.toString()));
    startActivity(intent);

Мой телефон рассматривает doubleValue как 135, 080 и т.д., игнорируя символ разделителя точек. Надеюсь, что окончательный код включает "точку", позволяющую отправлять десятичное значение. Кто-то решил эту проблему?

Ответы

Ответ 1

Показанный код Java отлично работает, полагая, что doubleValue является float или double.

Как было предложено здесь, Intent обрабатывается OutgoingCallBroadcaster.processIntent(), который обрабатывает строку, указанную в Intent, вызывая PhoneNumberUtils.convertKeypadLettersToDigits() и PhoneNumberUtils.stripSeparators().

Последний разделит все, кроме чисел, *, #, + и символы WILD, WAIT и PAUSE.

Здесь теряется ваш разделитель десятичных знаков.

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

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

Ответ 2

Размышляя о том, как работает pinpad, который был отправлен моим банком, вам всегда нужно вводить две цифры после десятичной точки, а форматирование на дисплее касается положения точки.

Итак, если я вхожу в "1", он интерпретируется как 0,01. Точно так же "1023" будет 10.23.

Я думаю, что такой же подход мог бы сработать для вас. Таким образом, 1.23 вводится как "123" и 0,80 как "80"

Я не вижу ссылки, которая ограничивает символы 0-9 # *, но все примеры следуют этому формату. Однако ваш пример начинается с * 234, который, похоже, соответствует этому правилу в спецификации

Случай a) 1, 2 или 3 цифры из набора (*, #), за которым следует 1X (Y), где X = любое число 0-4, Y = любое число 0-9, затем, необязательно "*, за которым следует любое количество любых символов", и заканчивая # SEND: Этот случай зарезервирован для использования HPLMN. Когда обслуживающая сеть получает такое сообщение от посещающего абонента, он должен передать сообщение USSD непосредственно в HPLMN. Если он получает его от домашний абонент, это зависит от сети, чтобы решить, следует ли его обрабатывать локально или передать его в HLR

http://www.etsi.org/deliver/etsi_ts/100600_100699/100625/07.00.00_60/ts_100625v070000p.pdf

В общем, я не уверен, что HPLMN (Home Public Land Mobile Network) или HLR (Home Location Register) ожидает дополнительных символов, даже если весь набор символов и даже другие наборы символов разрешены в USSD-протоколе.