如何在Android上执行USSD请求?

时间:2011-03-29 19:05:20

标签: android ussd

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

5 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

在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(...);

答案 4 :(得分:0)

希望它适合你:

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