如何以编程方式关闭/取消/关闭系统对话框(Android)

时间:2012-03-28 12:58:25

标签: android dialog

我有一个应用程序可以进行USSD调用,但在所有USSD调用之后,我得到了一个结果对话框的对话框。

我知道可以关闭此对话框,因为“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对话框出现给用户关闭,我的应用程序需要连续调用,无论如何都要以编程方式关闭这个系统对话框?

4 个答案:

答案 0 :(得分:6)

如果您尝试使用USSD调用我找到了问题的答案,您可以禁用结果文本

在俄罗斯博客中有一个post,显示如何连接到android的phoneutils服务,然后控制来自USSD(CALL和RESULT)的文本。他展示了一个使用界面(IExtentedendNetworkService)的示例,该界面仅在Android OS启动时绑定在手机工具上,如果没有任何其他应用程序尝试执行相同操作(因为只有一个服务可以绑定,可能是您的或不是,我不知道Android OS用来选择的规则。

在函数“CharSequence getUserMessage(CharSequence text);”中如果返回null,则不会显示结果对话框。

答案 1 :(得分:5)

只需在代码中添加此行。

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

答案 2 :(得分: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);
 }

}

在Manifest中添加以下内容:

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

答案 3 :(得分:0)

您可以发送系统级广播以关闭所有系统对话框

    val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
    sendBroadcast(closeDialog)

并在清单文件的 Service 或 BroadcastReceiver 类中添加意图过滤器。

    <intent-filter>
            
            <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
 
    </intent-filter>