【问题标题】:How to Get Response from USSD code from Android?如何从 Android 的 USSD 代码中获取响应?
【发布时间】:2018-09-19 23:09:47
【问题描述】:

我编写了一个使用 ussd 代码的应用程序。我想发送一个ussd请求,但我不知道如何获取数据并将其保存在字符串中。

示例代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btn = (Button) findViewById(R.id.button1);

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            String encodedHash = Uri.encode("#");
            String ussd = "*141*1" + encodedHash;
            startActivityForResult(new Intent("android.intent.action.CALL",
                    Uri.parse("tel:" + ussd)), 1);

        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    Toast.makeText(getApplicationContext(),
            "USSD: " + requestCode + "  " + resultCode + " ", 1).show();

    if (requestCode == 1) {

        if (resultCode == RESULT_OK) {
            // String result=data.getStringExtra("result");
            String dd = data.toString();
            Toast.makeText(getApplicationContext(), dd, 1).show();
        }

    }

截图应用:

如何解决我的问题?

【问题讨论】:

  • 您找到解决问题的方法了吗?
  • @sr.farzad:你是如何解决你的问题的?请提供我正在寻找的解决方案!
  • 不,我无法解决我的问题。因为在 android 中,不支持从 ussd 接收消息。我们无法管理来自 UUSD 的响应

标签: android service ussd


【解决方案1】:

使用 DIAL 或 CALL Intent 从自定义活动中拨打 USSD 代码是直接的,但收听返回的结果并不是因为 Android 没有适当支持在平台内拦截 USSD 调用,而是存在部分但未记录的支持在本机拨号器应用程序中。

首先,查看 Android 源代码中的 PhoneUtils 类。该链接适用于 4.0.3,但我相信这种部分支持自 2.3 以来一直存在。

具体来说,查看第 217 行,正在编写一个名为“com.android.ussd.IExtendedNetworkService”的意图。所以你需要做的是实现你自己的服务来响应这个意图。该服务需要根据Android框架的一部分IExtendedNetworkService.aidl来实现。

aidl 公开了几个函数,但我们关心的是该服务中的 getUserMessage(text) 函数。该文本是 USSD 调用返回的最终值。

注意事项:

  • 由于该服务是由PhoneUtils 绑定的,因此您需要在手机启动时启动该服务。这也意味着对服务的任何修改都需要重启手机。
  • 从 getUserMessage 返回 null 将禁止拨号器显示 USSD 结果,但无法完全隐藏拨号器。
  • 您还可以使用其他功能来更改通话过程中显示的文本。
  • 这似乎不适用于 USSD 提示(菜单),仅适用于最终结果。

在 github here 上查看示例代码。

【讨论】:

  • 你能发布一些相关的代码来回答这个问题吗?将最终答案与源引用一起放在网站上是个好主意,因为这使得 SO 成为编程问题的“最终”。
  • 我已经添加了一个 github 存储库的链接,该存储库具有所需的相关代码,它相当。最好检查一下存储库。点击here查看代码。
  • @Gondy 你能做一个使用你的 USSD 拦截器的工作示例项目吗?我有一个问题,无法将aidl文件导入我的java类
  • @Gondy 我实现了您提供的链接中的代码...我的手机是果冻豆4.1.1 ...部署软件后,我关闭手机并重新启动它...但是当我触发 USSD 请求时,我在 Logcat 中看不到任何内容......我在这里做错了什么?
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多