¿Cómo es posible hacer solicitudes de USSD en Android?

Algunas aplicaciones de marcador personalizadas (por ejemplo, Dialer de MotoBlur ) pueden realizar solicitudes de USSD. ¿Es realmente imposible hacerlo a través de SDK?

    Puede interceptar la respuesta de USSD. Para hacerlo, debe implementar la interfaz IExtendedNetworkService.aidl, que vincula el servicio con PhoneUtils. Luego puede interceptar cualquier respuesta de USSD y usted puede leerla fácilmente en su aplicación. FYI https://github.com/alaasalman/ussdinterceptor

    Puede marcar solicitudes de ussd como cualquier otro número con un bash de llamada como este:

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

    Sin embargo, afaik, actualmente no es posible analizar la cadena de resultados en su aplicación.

    A partir de Android O, es posible enviar solicitudes USSD utilizando TelephonyManager .

    Ussd api fue agregado en API26. Así que desde que Oreo trabaja con ussd se ve así:

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

    Espero que funcione para usted:

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