2012-03-28 14 views
8

Ich habe eine App, die USSD-Anrufe macht, aber nach allen USSD-Anrufen habe ich einen Dialog mit dem Ergebnis für den Benutzer bekommen.Wie man einen System-Dialog programmatisch schließt/abbricht/abbricht (Android)

Ich weiß, dass es möglich ist, diesen Dialog zu schließen, weil die "USSD Checker" -App dies tun, erhalten sie die Antwort von USSD, ohne den Benutzerdialog zu zeigen.

Im phone utils class

Hat die Funktion displayMMIComplete, die nach dem USSD-Aufruf abgeschlossen ist, zeigen eine TYPE_SYSTEM_DIALOG. Im PhoneUtils.java verwenden sie den Dialog wie folgt aus:

AlertDialog newDialog = new AlertDialog.Builder(context) 
        .setMessage(text) 
        .setPositiveButton(R.string.ok, null) 
        .setCancelable(true) 
        .create(); 
newDialog.getWindow().setType(
        WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 
newDialog.getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
newDialog.show(); 

dann kann ich nicht nur etwas Flagge schicken es zu schließen. Und ich kann diesen Import nicht als Systemklasse verwenden.

Und wenn ich X aufeinander folgende Anrufe X X Dialoge zum Benutzer schließen, und meine App muss aufeinander folgende Aufrufe zu tun, gibt es sowieso, um dieses System-Dialog programmatisch zu schließen?

+0

By the way, doesn dieser Code‘ t funktionieren für mich, auch wenn ich 'android.permission.SYSTEM_ALERT_WINDOW' zur AndroidManifest.xml hinzufüge. 'android.view.WindowManager $ BadTokenException: Fenster kann nicht hinzugefügt werden [email protected] - Berechtigung für diesen Fenstertyp verweigert ' –

+0

http://Stackoverflow.com/q/4344523/1065835. Es funktioniert –

Antwort

6

fand ich eine Antwort auf meine Frage, wenn Sie versuchen, USSD zu verwenden, um Anrufe Sie das Ergebnis Text

in einem russischen Blog deaktivieren kann es eine post ist, die zeigen, wie Sie mit dem phoneutils Service von Android verbinden kann Steuern Sie dann die Texte von USSD (CALL und RESULT). Er zeigt ein Beispiel mit einer Schnittstelle (IExtendendNetworkService), die nur auf dem Android OS-Start auf den Telefon-Utilities bindet, und wenn es keine andere App gibt, die versucht, das gleiche zu tun (Weil nur ein Dienst gebunden werden kann und vielleicht dein oder nicht), Ich kenne nicht die Regel, die Android OS verwendet, um zu wählen).

In der Funktion "CharSequence getUserMessage (CharSequence Text);" Wenn Sie null zurückgeben, wird das Ergebnis-Dialogfeld nicht angezeigt.

+0

Was, wenn ussd Dialog Abbrechen und Senden von Schaltflächen hat? – Choletski

4

Fügen Sie diese Zeile einfach in Ihren Code ein.

Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
sendBroadcast(intent); 
+1

Warum funktioniert es nicht für mich? – Plugie

+0

Was ist das Problem, auf das Sie dabei stoßen? Bitte beschreiben Sie hier ... – droidd

+3

Hallo Es funktioniert nicht für mich auch, Der USSD-Dialog immer noch da :( – dmh

2

Ich habe eine einfache Antwort aus diesem Blog here gefunden. Zuerst müssen wir einen einfachen Accessibility Service erstellen. Der Accessibility Service funktioniert nur, wenn er aktiviert ist. Bei der Einstellung gibt es eine Option Accessibility, in der das Projekt eingeschaltet und die Erlaubnis für Ihre Serviceklasse erteilt wird.

Hinweis: Methode performGlobalAction (GLOBAL_ACTION_BACK) erfordert Android 4.1+, wenn es nicht verwendet wird, ist es möglich, die 4.0 zu erfüllen. Es schließt das Fenster unmittelbar nach dem Alertdialog,

hier den Beispielcode:

public class USSDService extends AccessibilityService { 
String TAG="USSDService"; 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
    //In my mobile the class name has been looks like this. 
     if (event.getClassName().equals("com.mediatek.phone.UssdAlertActivity")) { 
//Method performGlobalAction (GLOBAL_ACTION_BACK) requires Android  
    // 4.1+ 
      performGlobalAction(GLOBAL_ACTION_BACK); 
     } 
    } 

    @Override 
    public void onInterrupt() { 


    } 
@Override 
protected void onServiceConnected() { 
    super.onServiceConnected(); 
     Log.v(TAG, "onServiceConnected"); 
     AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
     info.flags = AccessibilityServiceInfo.DEFAULT; 
     info.packageNames = new String[] 
       {"com.android.phone"}; 
     info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 
     info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
     setServiceInfo(info); 
} 

} 

In Manifest fügen Sie die folgenden Dinge:

<service 
    android:name=".USSDService" 
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
<intent-filter> 
<action android:name="android.accessibilityservice.AccessibilityService" /> 
</intent-filter> 

+0

funktioniert nicht für mich entweder nach diesem https://umeshisran4android.blogspot.co.id/2015/11/how-to -readparse-ussd-messages.html funktioniert überhaupt nicht, der ussd Dialog immer noch dort auf Eingabe wartend – dmh

+0

Einstellung-> Zugänglichkeitseinstellung -> Sie können eine Option "Ihr App-Name" sehen. Schalten Sie es ein. – krishnan

+0

kann ich bekommen Das Protokoll, von USSD, aber der USSD Dialog selbst wird nicht geschlossen, bis ich auf Abbrechen klicke Schließen – dmh

Verwandte Themen