2015-07-02 3 views
14

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

+3

Уверен, что я сделаю :) –

+2

Завтра я начну щедрость здесь, но я думаю, что вы должны добавить больше кода, такого как vars * doubleValue * и * pincode *, это может помочь другому пользователю найти ответ –

+0

you получил некоторый прогресс? –

ответ

6

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

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

Последние одна полосы все, кроме цифр, *, #, + и WILD, WAIT и PAUSE символов.

Здесь пропадает разделитель.

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

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

+0

Спасибо Markus. Я не могу сказать, ответил ли мне «приемник», я мог бы попробовать в любом случае. Могу ли я заменить «OutgoingCallBroadcaster» самостоятельно? –

+0

Я не думаю, что замена «OutgoingCallBroadcaster» реалистична. Но если вы посмотрите на комментарии в [link] (https://android.googlesource.com/platform/packages/services/Telephony/+/kitkat-dev/src/com/android/phone/OutgoingCallBroadcaster.java# 48) говорится, что он получит намерение «CALL» (из вашего приложения) и после выполнения того, что он делает, транслирует намерение «ACTION_NEW_OUTGOING_CALL». По-видимому, вы можете получить намерение «ACTION_NEW_OUTGOING_CALL» с помощью «BroadCastReceiver» и по-прежнему изменять сведения о намерениях, включая номер телефона, который включает в себя вашу команду USSD. –

+0

См., Например, [this] (http://stackoverflow.com/questions/9569118/how-do-you-receive-outgoing-call-in-broadcastreceiver#25328256) для примера получения намерения исходящего вызова. См. [Это сообщение в блоге] (http://android-developers.blogspot.fi/2011/01/processing-ordered-broadcasts.html), например, код фактического изменения номера телефона внутри намерения. Похоже, есть шанс, что вы сможете перехватить исходящий звонок и поместить разделитель на десятичный знак обратно туда, где он принадлежит, если только он не противоречит некоторым стандартам МСЭ и еще не исчерпан в процессе. –

6

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

Так что, если я вхожу в «1», он интерпретируется как 0,01. Аналогичным образом «1023» будет 10.23.

Я думаю, что такой же подход может сработать для вас. Итак, 1.23 введено как «123» и 0.80 as «80»

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

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

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-протоколе.

+0

Просто интересно, пытались ли вы кодировать десятичную точку с помощью Uri.encode (".")? – formica