2012-03-28 157 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