2012-03-28 115 views
8

我有一個應用程序可以進行USSD調用,但是在USSD調用之後,我得到了一個包含結果的對話框給用戶。如何以編程方式關閉/取消/關閉系統對話框(Android)

我知道可以關閉這個對話框,因爲「USSD Checker」應用程序這樣做,他們從USSD獲得響應而不顯示用戶對話框。

phone utils class

具有的功能displayMMIComplete是完成後的USSD通話,展現出TYPE_SYSTEM_DIALOG。在PhoneUtils.java他們所使用的對話框是這樣的:

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

然後,我不能隨便發一些標誌予以駁回。而且我不能使用那個導入它的系統類。

而當我做X連續調用出現X對話框關閉用戶,我的應用程序將需要做連續調用,無論如何編程方式關閉此係統對話框?

+0

順便說一句,這個代碼沒有按」即使我將android.permission.SYSTEM_ALERT_WINDOW添加到AndroidManifest.xml中,我仍然適用於我。 'android.view.WindowManager $ BadTokenException:無法添加窗口[email protected] - 此窗口類型的權限被拒絕 – 2013-09-27 12:23:18

+0

http://stackoverflow.com/q/4344523/1065835。它的工作原理 – 2013-09-27 12:51:14

回答

6

我發現一個回答我的問題,如果你想使用USSD呼叫您可以禁用結果文本

在俄羅斯的博客有一個post,告訴你如何可以連接到Android的phoneutils服務,然後控制來自USSD的文本(CALL和RESULT)。他使用界面(IExtentedendNetworkService)顯示了一個示例,該界面僅在android操作系統啓動時綁定在手機utils上,並且如果沒有任何其他應用程序試圖執行相同操作(因爲只有一個服務可以被綁定,並且可能是您的或不是,我不知道Android操作系統用來選擇的規則)。

在函數「CharSequence getUserMessage(CharSequence text);」如果你返回null,結果對話框將不會出現。

+0

如果ussd對話框取消併發送按鈕,該怎麼辦? – Choletski 2018-02-26 16:00:23

4

只需在代碼中添加此行即可。

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

爲什麼它不適合我? – Plugie 2015-09-13 05:47:58

+0

你在這方面遇到了什麼問題。請在這裏介紹... – droidd 2015-11-02 11:43:06

+3

喜它不是爲我工作壓力太大,該USSD對話仍然存在:( – dmh 2016-06-02 03:35:23

2

我從這個博客找到了一個簡單的答案here。 首先,我們必須創建一個簡單的輔助功能服務。輔助功能服務只有在啓用時纔有效。在設置中有一個選項輔助功能,在此過程中打開您的項目並授予您的服務類別的權限。

注意: 方法performGlobalAction(GLOBAL_ACTION_BACK)需要Android 4.1+,如果沒有使用它,可能會遇到4.0。它立即關閉窗口AlertDialog後,

這裏的示例代碼:

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

} 

清單中添加以下的事情:

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

+0

對我也 不起作用以下這https://umeshisran4android.blogspot.co.id/2015/11/how-to -readparse-USSD的messages.html 不是在所有工作中,USSD對話還在那裏等待輸入 – dmh 2016-06-02 03:36:23

+0

設置 - >輔助設置 - >你可以看到一個選項「的程序名稱」打開它 – krishnan 2016-06-02 09:57:23

+0

我能得到。日誌,從USSD但USSD對話框本身不會關閉,除非我點擊取消關閉它 – dmh 2016-06-03 23:16:56