【问题标题】:How to send a USSD code containing decimal floating point (.)?如何发送包含十进制浮点 (.) 的 USSD 代码?
【发布时间】:2015-07-02 23:04:42
【问题描述】:

我需要发送一个包含双精度值的 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 等,忽略了点分隔符。我希望最终代码包含“点”,允许发送十进制值。有人解决了这个问题吗?

【问题讨论】:

  • 明天我将在这里开始赏金,但我认为您必须添加更多代码,例如 vars doubleValuepincode,这可以帮助其他人用户找到答案
  • 你有预付款吗?
  • 不,我不知道。这两个答案的方法很好,但都没有解决问题。第二个可能让自己与 Etecsa 对话,但是……这只是一种可能性

标签: android decimal separator currency ussd


【解决方案1】:

假设 doubleValue 是浮点数或双精度数,显示的 Java 代码当然可以正常工作。

正如here 建议的那样,Intent 由 OutgoingCallBroadcaster.processIntent() 处理,它通过调用 PhoneNumberUtils.convertKeypadLettersToDigits() 和 PhoneNumberUtils.stripSeparators() 来处理 Intent 中给出的字符串。

后一个删除除数字之外的所有内容,*#+WILDWAITPAUSE 符号。

这是您的小数分隔符丢失的地方。

因此,分隔符应转义为特定的数值或替换为已接受的符号之一,以实际离开您的手机并到达接收器。

负责接收端的人可能会建议您正确格式化十进制数。

【讨论】:

  • 谢谢马库斯。我不知道“接收者”是否回答我,无论如何我都可以尝试。我可以自己替换OutgoingCallBroadcaster 吗?
  • 我不认为替换 OutgoingCallBroadcaster 是现实的。但是,如果您查看 link 中的 cmets,据说它将接收 CALL 意图(来自您的应用程序),并且在完成它所做的事情之后,它会广播 ACTION_NEW_OUTGOING_CALL 意图。您显然可以收到带有 BroadCastReceiverACTION_NEW_OUTGOING_CALL 意图,但仍会更改意图详细信息,包括包含您的 USSD 命令的电话号码。
  • 参见例如this 用于接收拨出呼叫意图的示例。请参阅this blog post,例如在 Intent 中实际修改电话号码的代码。所以看起来你有可能拦截拨出的电话并将小数点分隔符放回它所属的位置,除非它只是违反某些 ITU 标准和诸如此类的东西,并且在此过程的后期仍然会被剥离。
【解决方案2】:

想想我的银行寄给我的密码键盘的工作方式,您总是必须输入小数点后的两位数,并且显示屏上的格式处理点的位置。

所以如果我输入“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,然后,可选“* 后跟任意数量的任意字符”,并以 #SEND 结束: 这种情况是为 HPLMN 保留的。当服务网络从 访问用户,它应该将USSD消息直接传递给HPLMN。如果它从一个 归属用户,由网络决定是在本地处理还是将其传递给 HLR

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

一般来说,我不确定 HPLMN(家庭公共陆地移动网络)或 HLR(家庭位置寄存器)是否会期望额外的字符,即使 USSD 协议中允许使用整个字符集甚至其他字符集。

【讨论】:

  • 只是想知道您是否尝试过使用 Uri.encode(".") 对小数点进行编码?
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多