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

如何以编程方式关闭/取消/关闭系统对话框(Android),android,dialog,Android,Dialog,我有一个可以拨打USSD电话的应用程序,但是在所有USSD电话之后,我得到了一个对话框,并向用户显示了结果 我知道可以关闭此对话框,因为“USSD Checker”应用程序可以执行此操作,他们从USSD获得响应而不显示用户对话框 在 具有功能displaymiplete,在完成Ussd调用后,显示类型系统对话框。在PhoneUtils.java中,他们使用如下对话框: AlertDialog newDialog = new AlertDialog.Builder(context)

我有一个可以拨打USSD电话的应用程序,但是在所有USSD电话之后,我得到了一个对话框,并向用户显示了结果

我知道可以关闭此对话框,因为“USSD Checker”应用程序可以执行此操作,他们从USSD获得响应而不显示用户对话框

具有功能
displaymiplete
,在完成Ussd调用后,显示类型系统对话框。在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个对话框关闭,并且我的应用程序将需要执行连续呼叫,是否仍需要以编程方式关闭此系统对话框?

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

在一个俄语博客中,有一个演示如何连接到android的phoneutils服务,然后控制来自USSD的文本(调用和结果)。他展示了一个使用界面(IExtendendNetworkService)的示例,该界面仅在android操作系统启动时绑定手机UTIL,如果没有其他应用程序尝试这样做(因为只有一个服务可以绑定,可能是您的服务,也可能不是您的服务,我不知道android操作系统使用的规则是什么)


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

只需在代码中添加此行即可

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

我在这个博客上找到了一个简单的答案。 首先,我们必须创建一个简单的辅助功能服务。辅助功能服务只有在启用时才能工作。在设置中有一个选项“辅助功能”,在该选项中,打开项目并授予服务类权限

注: 方法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>


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

    val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
    sendBroadcast(closeDialog)
并在清单文件中的服务或BroadcastReceiver类中添加意图过滤器

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


顺便说一下,即使我在AndroidManifest.xml中添加了
android.permission.SYSTEM\u ALERT\u窗口,此代码对我也不起作用<代码>android.view.WindowManager$BadTokenException:无法添加窗口android.view.ViewRoot$W@40527640--此窗口类型的权限被拒绝
。它对我也不起作用,USSD对话框仍然存在:(这对我也不起作用。这根本不起作用,ussd对话框仍然在那里等待输入设置->可访问性设置->你可以看到一个选项“你的应用程序名”。打开它。我可以从ussd获取日志,但ussd对话框本身不会关闭,除非我单击“取消关闭”。谢谢。它对我起作用。但我无法获取文本cont。)ussd对话框响应的ent…我只得到
[PHONE]
作为
mtext
而不是实际的文本…你能用上面的代码在关闭ussd对话框之前或之后获得ussd对话框的内容吗?@JasonKrs你需要检查这个以获得ussd对话框响应。如果ussd对话框有取消和发送按钮怎么办?