2015-07-02 33 views
14

Muszę przesłać kod USSD zawierający podwójną wartość, która reprezentuje kwotę salda do przeniesienia. Ta wartość składa się z liczby całkowitej i opcjonalnie z separatora dziesiętnego i 2 dodatkowych cyfr. Mój kod wygląda następująco:Jak wysłać kod USSD zawierający dziesiętny zmiennoprzecinkowy (.)?

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

Mój telefon traktuje podwójną wartość jako 135, 080 itd. Ignorując znak separatora kropek. Mam nadzieję, że końcowy kod zawiera "kropkę", co pozwala przesłać wartość dziesiętną. Ktoś rozwiązał ten problem?

+3

Oczywiście, że to zrobię :) –

+2

Jutro zacznę tutaj nagrodę, ale myślę, że musisz dodać więcej kodu, np. Vars * doubleValue * i * pincode *, to może pomóc innemu użytkownikowi znaleźć odpowiedź –

+0

ty masz jakiś postęp? –

Odpowiedz

6

Przedstawiony kod Java działa dobrze, oczywiście zakładając, że doubleValue jest zmiennoprzecinkowe lub podwójne.

Jak sugeruje here zamiarem jest obsługiwany przez OutgoingCallBroadcaster.processIntent(), która przetwarza string podane w intencyjnego przez wywołanie PhoneNumberUtils.convertKeypadLettersToDigits() i PhoneNumberUtils.stripSeparators().

Ten ostatni taśmy wszystko z wyjątkiem liczb, *, #, + i WILD, WAIT i PAUSE symbole.

Tutaj następuje utrata separatora dziesiętnego.

Tak więc separator powinien zostać zmieniony na konkretną wartość liczbową lub zastąpiony przez jeden z akceptowanych symboli, aby rzeczywiście opuścić telefon i dotrzeć do odbiornika.

Osoba odpowiedzialna za urządzenie odbiorcze może prawdopodobnie doradzić w sprawie prawidłowego formatowania numeru dziesiętnego.

+0

Dziękuję Markus. Nie wiem, czy "odbiornik" mi odpowiada, i tak mógłbym spróbować. Czy mogę zastąpić 'OutgoingCallBroadcaster' przez siebie? –

+0

Nie sądzę, że zastąpienie 'OutgoingCallBroadcaster' jest realistyczne. Ale jeśli spojrzysz na komentarze w [link] (https://android.googlesource.com/platform/packages/services/Telephony/+/kitkat-dev/src/com/android/phone/OutgoingCallBroadcaster.java# 48) mówi się, że otrzyma intencję "CALL" (z twojej aplikacji) i po wykonaniu tego, co robi, nadaje intencję "ACTION_NEW_OUTGOING_CALL". Możesz najwyraźniej otrzymać intencję 'ACTION_NEW_OUTGOING_CALL' z' BroadCastReceiver' i nadal zmieniać szczegóły zamiaru, w tym numer telefonu, który zawiera polecenie USSD. –

+0

Zobacz np. [this] (http://stackoverflow.com/questions/9569118/how-do-you-receive-outgoing-call-in-broadcastreceiver#25328256) na przykład od otrzymania intencji połączeń wychodzących. Zobacz [ten wpis na blogu] (http://android-developers.blogspot.fi/2011/01/processing-ordered-broadcasts.html), na przykład kod faktycznie modyfikujący numer telefonu w intencji. Wygląda na to, że istnieje szansa, że ​​uda ci się przechwycić połączenie wychodzące i odłożyć separator dziesiętny tam, gdzie należy, chyba że jest to sprzeczne z niektórymi standardami ITU i tym podobne, a nadal jest usuwane w dalszej części procesu. –

6

Myśląc o tym, w jaki sposób pinpad, który wysłał mi mój bank, działa, zawsze należy wprowadzić dwie cyfry po kropce dziesiętnej, a formatowanie na wyświetlaczu zajmuje pozycję punktu.

Więc jeśli wprowadzę "1", zostanie to zinterpretowane jako 0.01. Podobnie "1023" będzie 10.23.

Myślę, że to samo podejście może dla Ciebie dobrze się sprawować. Więc 1,23 jest wpisane jako "123" i 0,80 jako "80"

Nie widzę odniesienia, które ogranicza znaki do 0-9 # *, ale wszystkie przykłady są zgodne z tym formatem. Jednak twój przykład zaczyna się * 234, co wydaje się pasować do tej reguły w specyfikacji

Przypadek a) 1, 2 lub 3 cyfry z zestawu (*, #), a następnie 1X (Y), gdzie X = dowolna liczba 0-4, Y = dowolna liczba 0-9, następnie opcjonalnie "* po której następuje dowolna liczba dowolnych znaków", a kończąc na # SEND: Przypadek ten jest zarezerwowany dla użytku HPLMN. Gdy sieć obsługująca odbiera taki komunikat od subskrybenta odwiedzającego , przesyła komunikat USSD bezpośrednio do HPLMN. Jeśli otrzyma go z domu abonenta, to do sieci, aby zdecydować, czy traktować go lokalnie lub przekazać go do HLR

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

W ogóle nie jestem pewien HPLMN (Home Public Land Mobile Network) lub HLR (Home Location Register) oczekiwałby dodatkowych znaków, nawet jeśli cały zestaw znaków, a nawet inne zestawy znaków są dozwolone w protokole USSD.

+0

Zastanawiasz się, czy próbowałeś kodować przecinek dziesiętny za pomocą Uri.encode (".")? – formica