【问题标题】:How is it possible to do USSD requests on Android?如何在 Android 上执行 USSD 请求?
【发布时间】:2011-03-29 19:05:19
【问题描述】:

一些自定义拨号器应用(例如,MotoBlur 的拨号器)能够执行 USSD 请求。通过SDK真的不可能做到这一点吗?

【问题讨论】:

    标签: android ussd


    【解决方案1】:

    在 API26 中添加了 Ussd api。 因此,由于 Oreo 与 ussd 合作看起来像这样:

        TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        manager.sendUssdRequest("*100#", new TelephonyManager.UssdResponseCallback() {
            @Override
            public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) {
                super.onReceiveUssdResponse(telephonyManager, request, response);
            }
    
            @Override
            public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) {
                super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode);
            }
        }, new Handler());
    
        TelephonyManager manager2 = manager.createForSubscriptionId(subIdForSecondSlotFromSubscriptonManager);
        manager2.sendUssdRequest(...);
    

    要获取 simID,您可以使用以下方法:

        SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
    
        List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
    
        for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
            int subscriptionId = subscriptionInfo.getSubscriptionId();
            Log.d("Sims", "subscriptionId:" + subscriptionId);
        }
    
        if (subscriptionInfoList != null) {
            if (subscriptionInfoList.size() == 1) {
                sim1 = subscriptionInfoList.get(0).getDisplayName().toString();
                tvSim1.setText(sim1);
            } else {
                sim1 = subscriptionInfoList.get(0).getDisplayName().toString();
                sim2 = subscriptionInfoList.get(1).getDisplayName().toString();
    
                tvSim1.setText(sim1);
                tvSim2.setText(sim2);
            }
    
        }
    

    【讨论】:

    • 嘿,米哈伊尔,你是唯一拥有新 API 27 代码的人......你能详细说明一下吗?我不明白manager2 createForSubscriptionId 的代码.... 所以现在我的 USSD 还没有发送
    • manager2 代码适用于双卡手机,当您从第二张卡发送 ussd 时。 subIdForSecondSlotFromSubscriptonManager - 是第二个插槽 ID
    • 太棒了....我一直在寻找那个...但是如何设置 subIdForSecondSlotFromSubscriptonManager 的值?另外,第一个插槽是否有 subIdForFirstSlotFromSubscriptonManager 值?我是说如果插槽 2 是我的双卡手机中的主插槽
    • 您可以获得订阅列表并在其中找到插槽List&lt;SubscriptionInfo&gt; sims = SubscriptionManager.from(context).getActiveSubscriptionInfoList(); for(SubscriptionInfo subInfo : sims){ ... slotIndex = subInfo.getSimSlotIndex() ... subscriptionForSlot = subInfo.getSubscriptionId() }的订阅
    【解决方案2】:

    您可以拦截 USSD 响应,为此您需要实现 IExtendedNetworkService.aidl 接口,该接口将服务与 PhoneUtils 绑定。然后它可以拦截任何 USSD 响应,您可以轻松地在您的应用程序中读取它。 供参考 https://github.com/alaasalman/ussdinterceptor

    【讨论】:

    • 由于安全限制,它不适用于 4.2.2(已对 PhoneApp 代码进行了更改)
    • 请任何人帮助我获得回复并重定向到其他活动
    【解决方案3】:

    您可以像任何其他号码一样拨打 ussd 请求,呼叫意图如下:

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

    但是,afaik,目前无法在您的应用中解析结果字符串。

    【讨论】:

    • 您可以发送请求,但应用程序无法获取结果。一些开发者要求将其添加到 android 中,但没有迹象表明该功能请求已被接受。
    • 但是在 * 之后附加 # 的原因是什么?
    • 这只是实际 USSD 编号的一部分,因此是本地运营商的实施细节,没关系
    • 构造 Uri 对象的更好方法:Uri.fromParts("tel", "*#12345#", null)。你不需要编码/解析。
    【解决方案4】:

    从 Android O 开始,可以使用 TelephonyManager 发送 USSD 请求。

    【讨论】:

    • 它仍然不适用于多步骤 USSD 会话
    • @davkutalek 我知道,这很糟糕。我想知道 Google 什么时候会在中添加它
    • @TheRealChx101 我们制作了一个绕过此限制的 SDK,请参阅 usehover.com
    • @davkutalek 现在 Google 屏蔽了无障碍 + 抓取方法,它是如何工作的?
    • @TheRealChx101 他们没有,是什么让你认为他们有?
    【解决方案5】:

    希望它对你有用:

    String suffix = Uri.encode("#");
    String ussd = suffix+"919"+"*"+number+suffix;
    
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse("tel:"+ ussd));
    startActivity(callIntent);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多