2015-07-02 26 views
14

Tôi cần gửi mã USSD chứa giá trị kép, số tiền này thể hiện số tiền tài khoản số dư được chuyển. Giá trị này được tạo thành bởi một số nguyên và tùy chọn dấu tách thập phân và thêm 2 chữ số. Mã của tôi trông giống như sau:Cách gửi mã USSD có chứa dấu phảy động thập phân (.)?

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

Điện thoại của tôi xử lý doubleValue là 135, 080, v.v ... bỏ qua ký tự dấu chấm. Tôi hy vọng mã cuối cùng bao gồm "dấu chấm", cho phép gửi giá trị thập phân. Ai đó đã giải quyết vấn đề này?

+3

Chắc chắn tôi sẽ làm :) –

+2

Ngày mai tôi sẽ bắt đầu một tiền thưởng ở đây, nhưng tôi nghĩ rằng bạn phải thêm nhiều mã hơn như vars * doubleValue * và * pincode *, điều này có thể giúp người dùng khác tìm thấy câu trả lời –

+0

bạn có một số trước? –

Trả lời

6

Mã Java được hiển thị hoạt động tốt, tất nhiên giả định rằng doubleValue là một phao hoặc một đôi.

Như được đề xuất here Mục đích được xử lý bởi OutgoingCallBroadcaster.processIntent() xử lý Chuỗi được đưa ra trong Mục đích bằng cách gọi PhoneNumberUtils.convertKeypadLettersToDigits() và PhoneNumberUtils.stripSeparators().

Sau một dải mọi thứ trừ con số, *, #, +WILD, WAITPAUSE các biểu tượng.

Đây là nơi dấu phân cách thập phân của bạn bị mất.

Vì vậy, dấu phân tách phải được chuyển sang giá trị số cụ thể hoặc được thay thế bằng một trong các biểu tượng được chấp nhận để thực sự rời khỏi điện thoại của bạn và tiếp cận với người nhận.

Bất kỳ ai chịu trách nhiệm về đầu nhận có thể có thể tư vấn cho bạn về việc định dạng đúng số thập phân của bạn.

+0

Cảm ơn Markus. Tôi không thể nói nếu "người nhận" trả lời tôi, tôi có thể thử anyway. Tôi có thể thay thế 'OutgoingCallBroadcaster' bằng chính bản thân mình không? –

+0

Tôi không nghĩ rằng thay thế 'OutgoingCallBroadcaster' là thực tế. Nhưng nếu bạn xem các nhận xét trong [link] (https://android.googlesource.com/platform/packages/services/Telephony/+/kitkat-dev/src/com/android/phone/OutgoingCallBroadcaster.java# 48) nó nói rằng nó sẽ nhận được ý định 'CALL' (từ ứng dụng của bạn) và sau khi làm những gì nó làm nó phát sóng một ý định' ACTION_NEW_OUTGOING_CALL'. Bạn dường như có thể nhận được ý định 'ACTION_NEW_OUTGOING_CALL' với' BroadCastReceiver' và vẫn thay đổi chi tiết ý định bao gồm số điện thoại bao gồm lệnh USSD của bạn. –

+0

Xem ví dụ [this] (http://stackoverflow.com/questions/9569118/how-do-you-receive-outgoing-call-in-broadcastreceiver#25328256) để biết ví dụ về việc nhận được ý định cuộc gọi đi. Xem [bài đăng trên blog này] (http://android-developers.blogspot.fi/2011/01/processing-ordered-broadcasts.html) ví dụ mã thực sự sửa đổi số điện thoại bên trong mục đích. Vì vậy, có vẻ như có một cơ hội mà bạn có thể chặn cuộc gọi đi và đặt dấu phân cách thập phân trở lại vị trí của nó trừ khi nó chỉ chống lại một số tiêu chuẩn ITU và không được xử lý sau này trong quá trình này. –

6

Suy nghĩ về cách pinpad mà ngân hàng của tôi gửi cho tôi, hoạt động, bạn luôn phải nhập hai chữ số sau dấu thập phân và định dạng trên giao diện hiển thị với vị trí của điểm.

Vì vậy, nếu tôi nhập "1", nó được hiểu là 0,01. Tương tự "1023" sẽ là 10,23.

Tôi nghĩ rằng cách tiếp cận tương tự có thể hoạt động tốt cho bạn. Vì vậy, 1.23 được nhập là "123" và 0,80 là "80"

Tôi không thể thấy tham chiếu giới hạn ký tự 0-9 # * nhưng tất cả các ví dụ đều tuân theo định dạng này. Tuy nhiên, ví dụ của bạn bắt đầu * 234, dường như phù hợp với quy tắc này trong đặc điểm kỹ thuật

Trường hợp a) 1, 2 hoặc 3 chữ số từ tập hợp (*, #) theo sau là 1X (Y), trong đó X = bất kỳ số nào 0-4, Y = bất kỳ số nào 0-9, sau đó, tùy chọn "* theo sau là bất kỳ số ký tự nào" và kết thúc bằng # SEND: Trường hợp này được dành riêng cho việc sử dụng HPLMN. Khi mạng phân phát nhận được thông báo như vậy từ một người đăng ký đang truy cập , nó sẽ chuyển trực tiếp thông điệp USSD tới HPLMN. Nếu nó nhận được nó từ một ngôi nhà thuê bao , nó tùy thuộc vào mạng để quyết định có nên đối xử với nó tại địa phương hoặc để vượt qua nó vào HLR

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

Nói chung, tôi không chắc chắn những HPLMN (Home Public Land Mobile Network) hoặc HLR (Home Location Register) sẽ mong đợi các ký tự thừa, mặc dù toàn bộ bộ ký tự và thậm chí các bộ ký tự khác được cho phép trong giao thức USSD.

+0

Chỉ cần tự hỏi liệu bạn đã thử mã hóa dấu thập phân với Uri.encode (".")? – formica

Các vấn đề liên quan