如何在Android上执行USSD请求?

int*_*_32 4 android ussd

一些自定义拨号器应用程序(例如,来自MotoBlur的拨号器)能够执行USSD请求.通过SDK实现这一点真的不可能吗?

ale*_*oeb 9

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

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

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

  • 您可以发送请求,但应用程序无法获取结果。一些开发者要求将其添加到 Android 中,但没有迹象表明该功能请求已被接受。 (3认同)
  • 但是在*后面添加#的原因是什么? (2认同)

Man*_*ani 9

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

  • 由于安全限制,它不适用于4.2.2(已对PhoneApp代码进行了更改) (3认同)

Mik*_*rov 9

在 API26 中添加了 ussd api。所以因为奥利奥和 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(...);
Run Code Online (Sandbox Code Playgroud)

要获取 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);
        }

    }
Run Code Online (Sandbox Code Playgroud)


gre*_*f82 6

从 Android O 开始,可以使用TelephonyManager.

  • @TheRealChx101 我们制作了一个 SDK 来绕过这个限制,请参阅 usehover.com (2认同)