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