2015-07-02 32 views
14

Ho bisogno di inviare un codice USSD contenente un doppio valore, che rappresenta l'importo del conto di saldo da trasferire. Questo valore è composto da un numero intero e facoltativamente un separatore decimale e altre 2 cifre. Il mio codice è il seguente:Come inviare un codice USSD contenente virgola mobile decimale (.)?

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); 

Il mio telefono tratta il doubleValue come 135, 080, ecc ignorando il carattere separatore di punti. Spero che il codice finale includa "punto", che consente di inviare il valore decimale. Qualcuno ha risolto questo problema?

+3

Certo che lo farò :) –

+2

Domani inizierò una taglia qui, ma penso che devi aggiungere altro codice come vars * doubleValue * e * pincode *, questo può aiutare l'altro utente a trovare la risposta –

+0

tu avuto un po 'di anticipo? –

risposta

6

Il codice Java mostrato funziona bene, naturalmente supponendo che doubleValue sia un float o un double.

Come suggerito here l'intento è gestita da OutgoingCallBroadcaster.processIntent() che elabora la stringa nel intenti chiamando PhoneNumberUtils.convertKeypadLettersToDigits() e PhoneNumberUtils.stripSeparators().

Quest'ultimo strisce tutto tranne numeri, *, #, + e il WILD, WAIT e PAUSE simboli.

Qui è dove viene perso il separatore decimale.

Quindi, il separatore deve essere salvato a un valore numerico specifico o sostituito da uno dei simboli accettati per lasciare effettivamente il telefono e raggiungere il destinatario.

Chiunque sia responsabile per il destinatario può probabilmente consigliarti sulla formattazione corretta del tuo numero decimale.

+0

Grazie Markus. Non posso dire se il "ricevitore" mi risponde, potrei provare comunque. Posso sostituire "OutgoingCallBroadcaster" da solo? –

+0

Non penso che la sostituzione di "OutgoingCallBroadcaster" sia realistica. Ma se si guardano i commenti in [collegamento] (https://android.googlesource.com/platform/packages/services/Telephony/+/kitkat-dev/src/com/android/phone/OutgoingCallBroadcaster.java# 48) si dice che riceverà l'intento 'CALL' (dalla tua applicazione) e dopo aver fatto ciò che fa trasmette un intento' ACTION_NEW_OUTGOING_CALL'. A quanto pare potresti ricevere l'intento 'ACTION_NEW_OUTGOING_CALL' con un' BroadCastReceiver' e comunque modificare i dettagli dell'intento, incluso il numero di telefono che include il comando USSD. –

+0

Vedere per es. [this] (http://stackoverflow.com/questions/9569118/how-do-you-receive-outgoing-call-in-broadcastreceiver#25328256) per un esempio di ricezione dell'intenzione di chiamata in uscita. Vedere [questo post del blog] (http://android-developers.blogspot.fi/2011/01/processing-ordered-broadcasts.html) ad esempio codice di modifica effettiva del numero di telefono all'interno dell'intento. Quindi sembra che ci sia la possibilità di intercettare la chiamata in uscita e riportare il separatore decimale nel punto in cui appartiene, a meno che non sia solo contro alcuni standard ITU e che cosa non sia ancora rimosso durante il processo. –

6

Pensando al modo in cui funziona il pinpad, che la mia banca mi ha inviato, è necessario inserire le due cifre dopo il punto decimale e la formattazione sul display si occupa della posizione del punto.

Quindi se inserisco "1", viene interpretato come 0,01. Analogamente "1023" sarebbe 10.23.

Penso che lo stesso approccio potrebbe funzionare bene per voi. Quindi 1,23 è immesso come "123" e 0,80 come "80"

Non riesco a vedere un riferimento che limiti i caratteri a 0-9 # * ma tutti gli esempi seguono questo formato. Tuttavia, l'esempio inizia * 234, che sembra corrispondere a questa regola nelle specifiche

Caso a) 1, 2 o 3 cifre dall'insieme (*, #) seguito da 1X (Y), dove X = qualsiasi numero 0-4, Y = qualsiasi numero 0-9, quindi, facoltativamente "* seguito da qualsiasi numero di caratteri", e concludendo con # SEND: Questo caso è riservato per l'utilizzo di HPLMN. Quando una rete di servizi riceve tale messaggio da un utente in visita , trasmette il messaggio USSD direttamente a HPLMN. Se si riceve da una casa abbonato , spetta alla rete di decidere se trattare localmente o per passarlo al HLR

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

In generale, io non sono sicuro che il HPLMN (casa Public Land Mobile Network) o HLR (Home Location Register) si aspetterebbero i caratteri extra, anche se l'intero set di caratteri e persino altri set di caratteri sono consentiti nel protocollo USSD.

+0

Ti chiedi solo se hai provato a codificare il punto decimale con Uri.encode (".")? – formica

Problemi correlati