Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Тяжело ли глобально перехватить нажатия пальца? - Android

10.10.2013, 03:35. Просмотров 1980. Ответов 19
Метки нет (Все метки)

Хочу в своей программе (куча окошек) провети частотный анализ "зон" клика пальцем.
В разрезе каждого активити или/и общий для всей программы.
Хочу нарисовать картинку типа (первый раз подключаю картинку к форуму):
http://s2.ipicture.ru/uploads/20131010/EQCTCajj.png
для оптимизации дизайна и перестановки элементов...

OnTouch вроде получает только те элементы на которые я "назначил" обработчик. Если же что-то пропустил. Или там уже был другой обработчик, то возникают проблемы. В винде было понятие Hook - перехват ЛЮБЫХ действий пользователя. Результат хочу писать в базу/таблицу в виде "date,time,activity,X,W,Y,H" для дальнейшего анализа...

Возможно ли подобное? Нужен для этого рут и хитрые дрова или возможно штатными средствами? Может можно положить невидимое "окно" поверх остальных, но не блокировать клик на лежащих под ним кнопках?
Миниатюры
Тяжело ли глобально перехватить нажатия пальца?  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 04:13     Тяжело ли глобально перехватить нажатия пальца? #2
Цитата Сообщение от Tester64 Посмотреть сообщение
Может можно положить невидимое "окно" поверх остальных
насколько я знаю, это единственный вариант.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 16:41  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #3
Цитата Сообщение от Netscape Посмотреть сообщение
насколько я знаю, это единственный вариант
Можете пример накидать? Хоть куски кода? Или ссылку на рабочий подобный код?
Никогда не получалось подобное сдалеть (раньше пробовал, но она была либо видимая, либо не активная).
Эту панель надо делать вручную (прошу код) или прямо в XML добавлять (прошу ссылку или кусок XML)?
Как сделать так чтобы она не перехватывала/блокировала нажатия на кнопки над которыми она лежит?
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 18:03     Тяжело ли глобально перехватить нажатия пальца? #4
Вот, написал рабочий код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
 
public class GlobalTouchService extends Service {
 
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        View detector = new View(this);
        detector.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d("touch", "touch. x=" + event.getX() + ", y=" + event.getY());
                return false;
            }
        });
                
        wm.addView(detector, params);
        
    }
    
}
Цитата Сообщение от Tester64 Посмотреть сообщение
Как сделать так чтобы она не перехватывала/блокировала нажатия на кнопки над которыми она лежит?
Это будет домашним заданием.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 18:56  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #5
За идею спасибо... Подключил, увы пока не заработало, буду думать/тестировать дальше и искать ошибки!

Добавлено через 4 минуты
А вообще я может изобретаю "велосипед" и подобное уже давно есть? Вроде ничего тяжелого, можно сделать одним мега-классом с одной командой подключения (запуск сервиса), со своей базой и даже отчетом по статистике...

Да и вроде для многих полезный инструмент...

Добавлено через 1 минуту
Можно кстати в виде "отчета" поверх окон рисовать (на том-же самом скрытом окне) картинку-отчет вроде того что я привел в "вопросе"...
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 19:09     Тяжело ли глобально перехватить нажатия пальца? #6
Цитата Сообщение от Tester64 Посмотреть сообщение
Подключил, увы пока не заработало, буду думать/тестировать дальше и искать ошибки!
Странно, что не заработало. Я на двух девайсах запускал и все работает.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 19:24  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #7
Может не правильно "подключил"...
Java
1
startService(new Intent(this, GlobalTouchService.class));
Ошибок не выдало, все работает по старому. сообщения о нажатиях в сервисе до логов не доходят
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 19:28     Тяжело ли глобально перехватить нажатия пальца? #8
По манифест, вы, конечно, не забыли ?
XML
1
2
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<service android:name=".GlobalTouchService" />
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 19:41  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #9
Цитата Сообщение от Netscape Посмотреть сообщение
<service android:name=".GlobalTouchService" />
Конечно забыл!
Теперь глобально "завесил" андроид - даже при закрытой программе все нажатия блокируются!
Теперь буду думать над "домашним заданием" - как это отменить!
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 19:43     Тяжело ли глобально перехватить нажатия пальца? #10
Естественно, что блокируются, сервис то продолжает работать.
Я через консоль удалял
adb uninstall package_name
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 20:17  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #11
Цитата Сообщение от Netscape Посмотреть сообщение
Я через консоль удалял
Достаточно перезапустить/переотправить/перекомпилить проект с отключенным сервисом....
Теперь думаю как не блокировать OnTouch после обработки...

Добавлено через 10 минут
Заменил :
Java
1
2
3
4
                0,
                //WindowManager.LayoutParams.MATCH_PARENT,
                0,
                //WindowManager.LayoutParams.MATCH_PARENT,
И вроде заработало... кнопки нажимаются и сообщения "touch." шлются!
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 20:21     Тяжело ли глобально перехватить нажатия пальца? #12
нормально шлются ? или вот так:
10-10 19:20:06.460: D/touch(7254): touch. x=0.0, y=0.0
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 21:23  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #13
Цитата Сообщение от Netscape Посмотреть сообщение
или вот так:
Нормально! Почти! Возможно благодаря этому: WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
touch. x=-39.417877, y=61.405853
Похоже точка отсчета - центр экрана! Теперь осталось получить/передать активное активити для записи в лог. Думаю с размерами экрана вообще не должно быть проблем - его можно вычислить в самом начале один раз.
mamadra
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 1
10.08.2015, 14:03     Тяжело ли глобально перехватить нажатия пальца? #14
Вопрос получилось ли у вас отключать данный сервис если да то как раскажите людям пожалуйта
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
11.08.2015, 19:13  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #15
Цитата Сообщение от mamadra Посмотреть сообщение
получилось ли у вас отключать данный сервис
Не понял вопроса... тема заброшена давно (необходимость отпала), но на тот момент добивался ПЕРЕХВАТА всех кликов даже находясь в других программах. Для отладки и статистики. Помню что перехватить получилось и даже в лог писал. Проблемой было то что началом отсчета считался центр монитора (верхний левый угол был примерно -500 х -800 = -W/2 x -H/2). Дальше не продвигал работу...
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
12.08.2015, 11:27     Тяжело ли глобально перехватить нажатия пальца? #16
Tester64, приветствую. Как раз на днях решал подобную задачу, глобальный перехват тача. Вы не решили проблему с блокировкой?
Делал так же, через сервис, но если layout будет на весь экран, то нажатия он-то перехватывает, но в тоже время блокирует работу тача.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
12.08.2015, 18:55  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #17
Цитата Сообщение от YuraAAA Посмотреть сообщение
Вы не решили проблему с блокировкой?
Я забросил проект еще в 10.2013!

Да - решил! Проблема была в том что надо было делать размер равным 0!
я уже приводил изменненый блок:
Java
1
2
3
4
0,
//WindowManager.LayoutParams.MATCH_PARENT,
0,
//WindowManager.LayoutParams.MATCH_PARENT,
Тогда нажатия "пропускались" на нижний уровень.

И обязательно включи флаг WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH !!! Это перехватыло нажатия вне активити!

Окошко перехвата сдвинулось в центр экрана. Все координаты вычислялись от центра [-500..500]x[-1000..1000] (от размеров экрана зависит). Тогда я еще был слишком слаб в этом и не мог сдвинуть активити в верхний левый угол - думаю легко решается...

p.s. Я может попробую на днях (на выходных) реанимировать тот сервис... Основной проблемой тогда было "ненадежный сервис" (удерживающий активити перехвата), который молча умирал раз в несколько часов... А мои системы перезапуска забирали до 100% проца - сейчас эту проблему вроде решил - тестирую свой сервис на разные применения (в том числе и "плавающие окна-информеры") - будет время реанимирую "модуль перехвата"...
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
13.08.2015, 10:43     Тяжело ли глобально перехватить нажатия пальца? #18
Tester64, большое спасибо, попробую
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
14.08.2015, 10:04  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #19
Цитата Сообщение от YuraAAA Посмотреть сообщение
большое спасибо, попробую
увы... реанимировал проект! Получается перехватывать все нажатия лишь в МОЕМ проекте!
В других ловится нажатие, но без координат... Достаточно свернуть мое активити как сообщения пропадают. Даже если оно еще в памяти и даже если все еще работает сервис запускающий перехватчик. И даже если из него запущены другие "флай-окошки", которые видны на экране.
Похоже ОС имеет какую-то систему защиты... Похоже ловится "основное активити" и внешние касания шлются только из своего...

В режиме отладки можно получать координаты через "%ADB% shell getevent", но они идут в HEX и без расшифровки.

Попробовал переделать по принципу: http://jhshi.me/2014/11/09/monitor-s...nt-in-android/
Тоже не помогло...

Если получится - отпишись!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2015, 06:34     Тяжело ли глобально перехватить нажатия пальца?
Еще ссылки по теме:

Как перехватить пакет (запрос) данных при текущей передаче данных? Android
Android Эффект нажатия кнопки
Android Работа ScrollView при передвижении пальца не по нему
Android Обработка длительного нажатия
Android Обработка нажатия кнопок

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
19.08.2015, 06:34  [ТС]     Тяжело ли глобально перехватить нажатия пальца? #20
Потратил на этот проект еще несколько часов... Итак...
1) Судя по всему нажатия на чужих активити перехватить стандартными средствами НЕ РЕАЛЬНО!!! (очень много документации перечитал) Но можно перехватывать все нажатия в СВОЕЙ программе.
2) Можно перехватить лишь нажатия! Ни о "драгах", ни о мультитатче речь даже не идет! Получаю лишь первое нажатия из драга первым пальцем. Причем идет событие "нажато вне вьюва" (из списка "нажали/отпустили/тащим/вне вьюва")
3) При переходе на чужое активити или Home-screen продолжаю получать факт нажатия, но уже без координат (x=0, y=0)
4) Нажатия не особо точные. Возможно плохой монитор, но разброс внизу стабильно на 2 миллиметра выше нажатых, а вверху почти ровно (кнопки на которые нажимаю обрабатываются правильно, а линию рисует чуть выше кнопок - а вверху совпадают).
5) как я уже писал ТЕОРЕТИЧЕСКИ можно перехватывать все нажатия если обладать рутом (доступ к ADB) и расшифровать события от нажатий (вроде только поймать нужные и перевести из хекс-а)

...В результате получил инструмент - пишу все события в аррэй (могу и в базу) и вывожу их на другое полупрозрачное (затемненное) "проницаемое для нажатий" окно поверх остальных активити сочной контрастной ломанной. При сворачивании моего активити темное окно остается пока не нажму еще раз (уже по другому активити или хоум-скрину) - тогда скрывается. Может кому идея пригодится... Например для анализа "как пользователь держит планшет и какой зоной чаще пользуется" (хотя не смогу поймать - "нажал вверху, а отпустил внизу").

Короче... спорное достижение... для отладки нужно многое прописать внутри "отлаживаемого проекта". Проект снова уходит в архив - пока негде инструмент применять...

Если я в чем-то ошибся - поправьте...
Yandex
Объявления
19.08.2015, 06:34     Тяжело ли глобально перехватить нажатия пальца?
Ответ Создать тему
Опции темы

Текущее время: 00:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru