Как отправить 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 и т. д., игнорируя символ разделителя точек. Я надеюсь, что окончательный код включает «точку», позволяющую отправить десятичное значение. Кто-то решил эту проблему?


person Roberto Tellez Ibarra    schedule 02.07.2015    source источник
comment
Завтра я начну здесь вознаграждение, но я думаю, что вы должны добавить больше кода, такого как vars doubleValue и pincode, это может помочь другому пользователю найти ответ   -  person Adrian Cid Almaguer    schedule 04.07.2015
comment
у тебя есть аванс?   -  person Adrian Cid Almaguer    schedule 10.07.2015
comment
Нет, не знаю. Эти два подхода к ответам хороши, но ни один из них не решает проблему. Второй отправляет себя возможно на диалог с Этексой, но... это только возможность   -  person Roberto Tellez Ibarra    schedule 10.07.2015


Ответы (2)


Показанный код Java отлично работает, конечно, если предположить, что doubleValue является числом с плавающей запятой или двойным значением.

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

Последний удаляет все, кроме цифр, *, #, + и символов WILD, WAIT и PAUSE.

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

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

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

person Markus Kauppinen    schedule 05.07.2015
comment
Спасибо, Маркус. Я не могу сказать, ответит ли мне получатель, я все равно могу попробовать. Могу ли я заменить OutgoingCallBroadcaster на свой? - person Roberto Tellez Ibarra; 06.07.2015
comment
Я не думаю, что замена OutgoingCallBroadcaster реалистична. Но если вы посмотрите на комментарии в ссылка сказано, что он получит намерение CALL (из вашего приложения) и после того, как сделает то, что он делает, передаст намерение ACTION_NEW_OUTGOING_CALL. Очевидно, вы могли бы получить намерение ACTION_NEW_OUTGOING_CALL с помощью BroadCastReceiver и при этом изменить детали намерения, включая номер телефона, который включает вашу USSD-команду. - person Markus Kauppinen; 06.07.2015
comment
См., например. это для примера получения намерения исходящего вызова . См. эту запись в блоге, например код фактического изменения номер телефона внутри намерения. Так что, похоже, есть шанс, что вы можете перехватить исходящий вызов и вернуть десятичный разделитель туда, где он должен быть, если только он не противоречит некоторым стандартам ITU и тому подобному и все равно удаляется позже в процессе. - person Markus Kauppinen; 06.07.2015

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

Поэтому, если я ввожу «1», это интерпретируется как 0,01. Точно так же «1023» будет 10,23.

Я думаю, что тот же подход мог бы хорошо работать для вас. Таким образом, 1,23 вводится как «123», а 0,80 — как «80».

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

Случай а) 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 (домашняя общественная наземная мобильная сеть) или HLR (домашняя регистрация местонахождения) будут ожидать дополнительных символов, даже несмотря на то, что весь набор символов и даже другие наборы символов разрешены в протоколе USSD.

person formica    schedule 05.07.2015
comment
Просто интересно, пробовали ли вы кодировать десятичную точку с помощью Uri.encode(.)? - person formica; 11.07.2015