我有一个应用程序可以进行USSD调用,但在所有USSD调用之后,我得到了一个结果对话框的对话框。
我知道可以关闭此对话框,因为“USSD Checker”应用程序执行此操作,他们从USSD获得响应而不显示用户对话框。
中功能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 :(得分: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>