在服务中开始阻止对话框

时间:2016-08-12 09:30:24

标签: android dialog alertdialog

阻止Android的所有对话框,这意味着在我的服务运行之前,应用程序或Android系统都不会显示任何对话框。有没有办法以编程方式进行?

1 个答案:

答案 0 :(得分:0)

我认为不能阻止所有弹出窗口。

对我而言,android通常不允许这样做。

但你可以尝试(如果你真的想:))使你的应用程序成为Accessibility Service,它将对显示的弹出窗口作出反应并立即关闭它。要关闭弹出窗口,您可以在其上找到一些取消按钮并执行单击或performGlobalAction(GLOBAL_ACTION_BACK);(如果可取消)。

在这里查看一些代码以找到弹出窗口:Android unable read window content on few devices using accessibility service(我不知道这是否有效)

您还可以查看此内容,了解如何使用辅助功能服务查找视图并点击任何应用的更多灵感:Programmatically enabling/disabling accessibility settings on Android device

已编辑:更多详情

您需要按照此标准教程将该服务添加到您的应用中:https://developer.android.com/training/accessibility/service.html

首先要注意的是,您应该决定使用xml配置并在教程中包含android:canRetrieveWindowContent="true"

<accessibility-service
 android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
 android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp"
 android:accessibilityFeedbackType="feedbackSpoken"
 android:notificationTimeout="100"
 android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
 android:canRetrieveWindowContent="true"
/>

我认为你不需要行android:packageName

然后你需要尝试在回调方法中应该发生什么 - 这只是我粗略的建议:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
   AccessibilityNodeInfo source = event.getSource();        
   if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) 
       if(isAlert(source)) //explore the view (maybe recursively) to find if there is an alert
           performGlobalAction(GLOBAL_ACTION_BACK);
}

,递归方法可以像

private boolean isAlert(AccessibilityNodeInfo view){

   int count = view.getChildCount();
   boolean result = false;
   for(int i=0; i<count; i++){
       AccessibilityNodeInfo child = view.getChild(i);
       if(child.getClassName().contains("Alert")){ 
            return true;
       }
       if (explore(child));
        result = true;
       child.recycle();
    return result;
}