首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全屏TYPE_ACCESSIBILITY_OVERLAY

全屏TYPE_ACCESSIBILITY_OVERLAY
EN

Stack Overflow用户
提问于 2018-06-04 09:52:59
回答 1查看 3.8K关注 0票数 2

我对Android上的可访问性很陌生。在浏览类和文档时,我在WindowManager类中遇到了WindowManager

文档说(只有相关的文本)

例如,如果有一个可触摸的全屏幕可访问性覆盖,则下面的窗口将由可访问性服务进行自省,即使它们被一个可触摸的窗口覆盖。

因此,我着手实现这一目标,一个全屏幕可访问性覆盖,并尝试自省下面的窗口。

扩展AccessibilityService,并在调用onServiceConnected时添加了全屏覆盖(添加覆盖的灵感来自这里)

代码语言:javascript
复制
@Override
protected void onServiceConnected() {
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    FrameLayout mLayout = new FrameLayout(this);
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
    lp.format = PixelFormat.TRANSLUCENT;
    lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    lp.gravity = Gravity.TOP;
    wm.addView(mLayout, lp);

    mLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // Here I'm getting the touch events on the overlay I added
            return false;
        }
    });
}

现在,问题是,我如何内省或发现下面的窗口覆盖?即使在onAccessibilityEvent回调中,我也得到了这个覆盖窗口。getWindows()总是有一个size of 1。它不是反驳了上面为TYPE_ACCESSIBILITY_OVERLAY所作的断言吗?

相关信息:接收服务设置中已禁用touchExplorationMode的覆盖上的触摸事件

代码语言:javascript
复制
android:canRequestTouchExplorationMode="false"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 03:16:03

您似乎缺少的是配置中的flagRetrieveInteractiveWindows。这些属性和窗口布局参数配置应该可以工作,而无需禁用canRequestTouchExplorationMode以获取事件,并让getWindows返回您下面的AccessibilityWindowInfo实例:

代码语言:javascript
复制
    <?xml version="1.0" encoding="utf-8"?>
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:packageNames="test.demo.com.tests"
        android:accessibilityEventTypes="typeAllMask"
        android:accessibilityFlags="flagRetrieveInteractiveWindows|flagReportViewIds|flagIncludeNotImportantViews"
        android:accessibilityFeedbackType="feedbackAllMask"
        android:notificationTimeout="100"
        android:canRetrieveWindowContent="true"
        />

与服务有关的服务:

代码语言:javascript
复制
    @Override
    protected void onServiceConnected() {
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        FrameLayout layout = new FrameLayout(this);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_FULLSCREEN |
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE|
                WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS| 
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.TOP;

        windowManager.addView(layout, params);
        layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //You can either get the information here or on onAccessibilityEvent                 
                return false;
            }
        });
    }

编辑

添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS以完成全屏操作并删除canRequestTouchExplorationMode,因为与此属性关联的标志不应包括在内,因此没有任何用处。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50677833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档