2013-09-28 17 views
13

Ho scritto un'applicazione che utilizza il codice ussd. Voglio inviare una richiesta per un ussd ma non so come ottenere i dati e salvarli in una stringa.Come ottenere risposta dal codice USSD da Android?

codice di esempio:

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

    } 

applicazione Screenshots: enter image description here

enter image description here

come risolvere il mio problema?

+0

Hai trovato il modo di risolvere il tuo problema? – gkiko

+0

No! I do not ...... –

+0

https://code.google.com/p/android/issues/detail?id=57120#c14 – gkiko

risposta

2

La composizione di un codice USSD da un'attività personalizzata è semplice con un intento DIAL o CALL, ma l'ascolto del risultato restituito non è dovuto ad Android che non supporta correttamente l'intercettazione delle chiamate USSD all'interno della piattaforma, ma parziale sebbene non documentato esiste all'interno dell'applicazione dialer nativa.

Per iniziare, guarda la classe PhoneUtils nel codice sorgente Android. Il collegamento è per 4.0.3 ma credo che questo supporto parziale sia presente dal 2.3.

In particolare, guardando la riga 217, viene composto un intento con il nome "com.android.ussd.IExtendedNetworkService". Quindi quello che devi fare è implementare il tuo servizio che risponde a tale intento. Il servizio deve essere implementato in base allo IExtendedNetworkService.aidl, che fa parte del framework Android.

L'help mostra diverse funzioni, ma quella a cui teniamo è la funzione getUserMessage (testo) in quel servizio. Il testo è il valore finale restituito dalla chiamata USSD.

Note:

  • Dal momento che il servizio è rilegato sul da PhoneUtils, allora avete bisogno di avviare il servizio al telefono boot. Significa anche che qualsiasi modifica al servizio richiederà un riavvio del telefono.
  • Il ripristino di null da getUserMessage impedisce al dialer di mostrare il risultato USSD ma non è possibile nascondere completamente il dialer.
  • È inoltre possibile utilizzare le altre funzioni per modificare il testo visualizzato mentre è in corso la chiamata.
  • Sembra non funzionare sui prompt USSD (menu), solo sui risultati finali.

Acquista un codice di esempio su github here.

+0

Puoi pubblicare del codice rilevante che risponde a questa domanda? È una buona idea avere la risposta finale sul sito, accanto ai riferimenti di origine, poiché ciò rende SO un "end-all" per le domande di programmazione. –

+1

Ho già aggiunto il link a un repository github che ha il codice necessario necessario, è abbastanza. Sarà meglio che controlli il repository. clicca [qui] (https://github.com/alaasalman/ussdinterceptor) per vedere il codice. – Gondy

+0

@Gondy puoi creare un progetto di esempio di lavoro che usi il tuo USSD Interceptor?Ho un problema che non può importare il file AIDL alla mia classe java – HendraWD

Problemi correlati