2013-09-28 14 views
13

Ich habe eine Anwendung geschrieben, die Ussd-Code verwendet. Ich möchte eine Anfrage für ein ussd senden, aber ich weiß nicht, wie man die Daten erhält und in einem String speichert.Wie bekomme ich eine Antwort vom USSD-Code von Android?

Beispielcode:

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

    } 

Screenshots Anwendung: enter image description here

enter image description here

, wie mein Problem zu lösen?

+0

Haben Sie den Weg gefunden, Ihr Problem zu lösen? – gkiko

+0

Nein, ich weiß nicht ...... –

+0

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

Antwort

2

Das Wählen eines USSD-Codes aus einer benutzerdefinierten Aktivität erfolgt direkt mit DIAL oder CALL, aber das Abrufen des zurückgegebenen Ergebnisses ist nicht darauf zurückzuführen, dass Android keine ordnungsgemäße Unterstützung für das Abfangen von USSD-Aufrufen innerhalb der Plattform, aber teilweise undokumentierte Unterstützung bietet existiert innerhalb der nativen Dialer-Anwendung.

Betrachten Sie zunächst die PhoneUtils-Klasse im Android-Quellcode. Der Link ist für 4.0.3, aber ich glaube, dass diese Teilunterstützung seit 2.3 vorhanden ist.

Speziell, in Zeile 217, wird eine Absicht mit dem Namen "com.android.ussd.IExtendedNetworkService" komponiert. Also müssen Sie Ihren eigenen Service implementieren, der auf diese Absicht reagiert. Der Dienst muss gemäß der IExtendedNetworkService.aidl implementiert werden, die ein Teil des Android-Framework ist.

Die Hilfe stellt mehrere Funktionen zur Verfügung, aber die, die uns interessiert, ist die Funktion getUserMessage (Text) in diesem Dienst. Der Text ist der endgültige Wert, der vom USSD-Aufruf zurückgegeben wird.

Hinweise:

  • Da der Dienst von PhoneUtils binded auf, dann müssen Sie den Dienst am Telefon Booten starten. Dies bedeutet auch, dass jede Änderung am Dienst einen Neustart des Telefons erfordert.
  • Wenn NULL von getUserMessage zurückgegeben wird, wird unterdrückt, dass der Dialer das USSD-Ergebnis anzeigt, aber es gibt keine Möglichkeit, den Dialer vollständig zu verbergen.
  • Sie können auch die anderen Funktionen verwenden, um den während des Anrufs angezeigten Text zu ändern.
  • Dies scheint nicht auf USSD Aufforderungen (Menüs), nur auf Endergebnisse zu funktionieren.

Überprüfen Sie einen Beispielcode auf GitHub here.

+0

Kannst du einen relevanten Code posten, der diese Frage beantwortet? Es ist eine gute Idee, die endgültige Antwort neben den Quellenreferenzen auf der Seite zu haben, da dies SO zu einem "End-all" für Programmierfragen macht. –

+1

Ich habe bereits einen Link zu einem Github-Repository hinzugefügt, das den entsprechenden Code benötigt, es ist ziemlich. Es ist besser, wenn Sie das Repository auschecken. Klicke [hier] (https://github.com/alaasalman/ussdinterceptor), um den Code zu sehen. – Gondy

+0

@Gondy Können Sie ein funktionierendes Beispielprojekt erstellen, das Ihren USSD Interceptor verwendet?Ich habe ein Problem, das die aidl-Datei zu meiner Java-Klasse – HendraWD

Verwandte Themen