Подтвердить что ты не робот

Как служба может прослушивать жесты/события касания?

Мне интересно, как приложения, такие как SwipePad и Wave Launcher, способны обнаруживать жесты/события касания просто через службу. Эти приложения могут обнаруживать жесты касания, даже если они не находятся в их собственной деятельности. Я посмотрел по всему Интернету и не нашел, как они могут это сделать.

Мой главный вопрос заключается в том, как услуга может прослушивать на сенсорных клиентах/событиях так же, как обычная активность может получать MotionEvents, даже если она не может быть в исходной Деятельности или контексте. Я по существу пытаюсь создать приложение, которое будет возвращать конкретный жест касания от пользователя, независимо от того, какая активность находится на вершине и что-то делать, когда этот жест будет восстановлен. Поддержание касания будет потоком, выполняющимся в фоновом режиме в качестве службы.

4b9b3361

Ответ 1

У меня была такая же проблема, и я, наконец, понял это! Благодаря этому сообщению: Создание окна оверлея системы (всегда сверху). Вам нужно использовать окно предупреждения вместо наложения (и это также означает, что вы можете использовать его в Andoid ICS):

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

Затем просто присоедините GestureListener следующим образом:

GestureDetector gestureDetector = new GestureDetector(this, new AwesomeGestureListener());
View.OnTouchListener gestureListener = new View.OnTouchListener() {
      public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
      }
};

overlayView.setOnTouchListener(gestureListener);

Yay!

Ответ 2

Интересный вопрос. Я не знаю, как они это сделали, и я нашел сообщения в группах Google, которые говорят мне, что нет глобального прослушивателя. Но у меня есть идея в любом случае...

Я нашел этот пост, где кому-то удается отобразить всплывающее окно из службы. Если бы я сделал это всплывающее окно прозрачным и полноэкранным, я уверен, что смогу захватить штрихи, так как мне разрешено устанавливать

Ответ 3

Я тестировал это на API 21 и 5-й связи, и я смог войти в систему из службы, когда система была запущена сенсорным событием. Однако данные внутри объекта MotionEvent, например, координат, возвращают 0.0, когда ВНЕШНИЕ из того, что кажется моим пакетом приложений.

Два источника  интеграция,  permission

Мне любопытно, почему event.getX(), event.getY() и event.getPressure() возвращают 0.0, если не находятся в действии приложения, в котором работает служба.

Edit

Это решение не мешает другим слушателям получать сенсорное событие, гарантированное службой из-за

public boolean onTouch(View v, MotionEvent e){
    Log.d(LOG_TAG, "Touch event captured");
    return false;      

Возвращая false, он позволяет другим слушателям получать событие.

Edit2

По-видимому, диспетчер ввода в ОС будет устанавливать координаты и давление на 0, если текущая активность и слушатель не имеют идентификатор UID, вот источник

Ответ 4

Я тестировал все возможные решения, но ничего не работало, некоторые не активировали сенсорное событие, которое они застыли на экране.

Итак, я сделал некоторое обратное проектирование и теперь отправляю решение, которое работает

  WindowManager.LayoutParams params = new android.view.WindowManager.LayoutParams(0, 0, 0, 0, 2003, 0x40028, -3);
        View mView = new View(this);

        mView.setOnTouchListener(this);

        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);