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

Трябва да изпратя USSD код, съдържащ двойна стойност, която представлява балансовата сума по сметката за прехвърляне. Тази стойност се състои от цяло число и по избор десетичен разделител и още 2 цифри. Моят код изглежда по следния начин:

    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
Утре ще започна награда тук, но мисля, че трябва да добавите повече код като променливите doubleValue и pincode, това може да помогне на друг потребител да намери отговора   -  person Adrian Cid Almaguer    schedule 04.07.2015
comment
имаш ли някакъв аванс?   -  person Adrian Cid Almaguer    schedule 10.07.2015
comment
Не, нямам. Тези два подхода за отговор са добри, но никой от тях не решава проблема. Вторият се изпраща евентуално на диалог с Etecsa, но... това е само възможност   -  person Roberto Tellez Ibarra    schedule 10.07.2015


Отговори (2)


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

Както се предлага тук намерението се обработва от 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

Мислейки за начина, по който работи 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, след това по избор „*, последвано от произволно число от произволни знаци", и завършвайки с # ИЗПРАЩАНЕ: Този случай е запазен за използване на 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 протокола.

person formica    schedule 05.07.2015
comment
Просто се чудя дали сте опитвали да кодирате десетичната запетая с Uri.encode(.)? - person formica; 11.07.2015