【问题标题】:Start blocking dialogs in service开始阻止服务中的对话框
【发布时间】:2016-12-19 06:26:11
【问题描述】:

阻止Android的所有对话框,这意味着在我的服务运行之前不会出现任何对话框,无论是应用程序还是Android系统。有没有办法以编程方式做到这一点?

【问题讨论】:

    标签: android dialog android-alertdialog


    【解决方案1】:

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

    对我来说,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"like:

    <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;
    }
    

    【讨论】:

    • 你能提供一些样板文件/或帮助代码这样做吗,因为我还想不通
    • 好的,我刚刚为您的问题快速添加了一些代码。
    • 我仍然无法复制你的想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2016-12-06
    • 2017-05-06
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多