Cómo obtener respuesta del código USSD de Android?

He escrito una aplicación que usa código ussd. Quiero enviar una solicitud para un ussd pero no sé cómo obtener los datos y guardarlo en una cadena.

Código de muestra:

@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(); } } 

Aplicación de capturas de pantalla: Introduzca aquí la descripción de la imagen

Introduzca aquí la descripción de la imagen

Cómo resolver mi problema?

Marcando un código USSD de una actividad personalizada es sencillo usando una intención de DIAL o CALL, pero escuchar el resultado devuelto no se debe a que Android no tiene soporte adecuado para interceptar llamadas USSD dentro de la plataforma, pero existe apoyo parcial aunque indocumentado dentro del nativo Dialer.

Como punto de partida, observe la clase PhoneUtils en el código fuente de Android. El enlace es para 4.0.3 pero creo que este apoyo parcial ha estado presente desde 2.3.

Específicamente, mirando la línea 217, se está componiendo una intención con el nombre "com.android.ussd.IExtendedNetworkService". Así que lo que necesita hacer es implementar su propio servicio que responde a esa intención. El servicio debe implementarse de acuerdo con IExtendedNetworkService.aidl, que forma parte del framework de Android.

El aidl expone varias funciones, pero la que nos importa es la función getUserMessage (texto) en ese servicio. El texto es el valor final devuelto por la llamada USSD.

Notas:

  • Dado que el servicio es enlazado por PhoneUtils, entonces usted necesita para iniciar el servicio en el teléfono de arranque. También significa que cualquier modificación en el servicio necesitará un reinicio del teléfono.
  • Devolver null de getUserMessage suprimirá el marcador de mostrar el resultado USSD pero no hay manera de ocultar completamente el marcador.
  • También puede utilizar las otras funciones para cambiar el texto mostrado mientras la llamada está en curso.
  • Esto no parece funcionar en los mensajes de USSD (menús), sólo en los resultados finales.

Compruebe un código de ejemplo en github aquí .

  • ¿Cómo es posible hacer las peticiones de USSD en Android?
  • Hacer llamada USSD en android
  • Cómo leer / interceptar mensaje USSD que viene en el teléfono Android
  • ¿Prevenir el diálogo de USSD y leer la respuesta de USSD?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.