Как отправить код 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-протоколе.