Полный экран TYPE_ACCESSIBILITY_OVERLAY - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в доступе к Android.Просматривая классы и документацию, я обнаружил TYPE_ACCESSIBILITY_OVERLAY внутри класса WindowManager.

В документации написано (только соответствующий текст)

Например, если имеется полноэкранный оверлей доступности, который является сенсорным, окна под ним будут интроспективными для службы специальных возможностей, даже если они закрыты сенсорным окном.

Поэтому я решилдостигните только этого, полноэкранного оверлея доступности и попытайтесь проанализировать окна под ним

Extended AccessibilityService и добавили мой полноэкранный оверлей, когда вызывается onServiceConnected (вдохновение для добавления оверлея пришло от здесь )

@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 в настройках сервиса

android:canRequestTouchExplorationMode="false"

1 Ответ

0 голосов
/ 11 июня 2018

Чего вам не хватает, так это flagRetrieveInteractiveWindows в вашей конфигурации.Эти свойства и конфигурация параметров компоновки окна должны работать, не требуя, чтобы вы отключили canRequestTouchExplorationMode для получения событий, и getWindows возвращает экземпляры AccessibilityWindowInfo под вашими данными:

    <?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"
        />

И на подключенной службе:

    @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, так как флаг, связанный с этим свойством, не должен быть включен, и,следовательно, бесполезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...