С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

Возможно ли подобное? Нужен для этого рут и хитрые дрова или возможно штатными средствами? Может можно положить невидимое "окно" поверх остальных, но не блокировать клик на лежащих под ним кнопках?
0
Миниатюры
Тяжело ли глобально перехватить нажатия пальца?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2013, 03:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тяжело ли глобально перехватить нажатия пальца? (Программирование Android):

Обработка движения пальца по экрану - Программирование Android
Подскажите, пожалуйста, как обрабатывать движение пальца по экрану, например, параллельно высоте экрана, т. е. прикосновение пальца, затем...

Работа ScrollView при передвижении пальца не по нему - Программирование Android
Подскажите, пожалуйста, можно ли сделать так, что бы ScrollView прокручивался при движении пальцем не по нему, а в произвольной точке...

Глобально перехватить нажатие сочитания клавиш - C++ Builder
Вот нашол в интернете Как глобально перехватить нажатие клавиши или комбинации клавиш. Для примера, перехватим комбинацию ALT +...

Как перехватить глобально нажатие клавиши '~'? - Visual Basic
Как перехватить глобально нажатие клавиши '~'?

Глобально перехватить клавишу и выполнить определенный код - Visual Basic .NET
Я свою запускаю программу, перехожу на другое окно(текстовый документ или браузер), нажимаю клавишу включения(f1 или home) и МОЯ программа...

Как глобально(вне фокуса) перехватить события клавиатуры - C++ Qt
Здравствуйте! Подскажите, как глобально(вне фокуса) перехватить события клавиатуры. В моем случае вне фокуса - это когда окно программы...

19
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 04:13 #2
Цитата Сообщение от Tester64 Посмотреть сообщение
Может можно положить невидимое "окно" поверх остальных
насколько я знаю, это единственный вариант.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 16:41  [ТС] #3
Цитата Сообщение от Netscape Посмотреть сообщение
насколько я знаю, это единственный вариант
Можете пример накидать? Хоть куски кода? Или ссылку на рабочий подобный код?
Никогда не получалось подобное сдалеть (раньше пробовал, но она была либо видимая, либо не активная).
Эту панель надо делать вручную (прошу код) или прямо в XML добавлять (прошу ссылку или кусок XML)?
Как сделать так чтобы она не перехватывала/блокировала нажатия на кнопки над которыми она лежит?
0
Netscape
374 / 361 / 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 Посмотреть сообщение
Как сделать так чтобы она не перехватывала/блокировала нажатия на кнопки над которыми она лежит?
Это будет домашним заданием.
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 18:56  [ТС] #5
За идею спасибо... Подключил, увы пока не заработало, буду думать/тестировать дальше и искать ошибки!

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

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

Добавлено через 1 минуту
Можно кстати в виде "отчета" поверх окон рисовать (на том-же самом скрытом окне) картинку-отчет вроде того что я привел в "вопросе"...
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 19:09 #6
Цитата Сообщение от Tester64 Посмотреть сообщение
Подключил, увы пока не заработало, буду думать/тестировать дальше и искать ошибки!
Странно, что не заработало. Я на двух девайсах запускал и все работает.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 19:24  [ТС] #7
Может не правильно "подключил"...
Java
1
startService(new Intent(this, GlobalTouchService.class));
Ошибок не выдало, все работает по старому. сообщения о нажатиях в сервисе до логов не доходят
0
Netscape
374 / 361 / 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" />
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
10.10.2013, 19:41  [ТС] #9
Цитата Сообщение от Netscape Посмотреть сообщение
<service android:name=".GlobalTouchService" />
Конечно забыл!
Теперь глобально "завесил" андроид - даже при закрытой программе все нажатия блокируются!
Теперь буду думать над "домашним заданием" - как это отменить!
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 19:43 #10
Естественно, что блокируются, сервис то продолжает работать.
Я через консоль удалял
adb uninstall package_name
0
Tester64
396 / 357 / 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." шлются!
0
Netscape
374 / 361 / 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
0
Tester64
396 / 357 / 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
Похоже точка отсчета - центр экрана! Теперь осталось получить/передать активное активити для записи в лог. Думаю с размерами экрана вообще не должно быть проблем - его можно вычислить в самом начале один раз.
0
mamadra
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 1
10.08.2015, 14:03 #14
Вопрос получилось ли у вас отключать данный сервис если да то как раскажите людям пожалуйта
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
11.08.2015, 19:13  [ТС] #15
Цитата Сообщение от mamadra Посмотреть сообщение
получилось ли у вас отключать данный сервис
Не понял вопроса... тема заброшена давно (необходимость отпала), но на тот момент добивался ПЕРЕХВАТА всех кликов даже находясь в других программах. Для отладки и статистики. Помню что перехватить получилось и даже в лог писал. Проблемой было то что началом отсчета считался центр монитора (верхний левый угол был примерно -500 х -800 = -W/2 x -H/2). Дальше не продвигал работу...
0
11.08.2015, 19:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2015, 19:13
Привет! Вот еще темы с ответами:

Отлавливание нажатия клавиш глобально - C#
Как мне сделать, чтобы нажатия клавиш отлавливались из любого места в программе (не зависимо от того, какой контрол активен)? Подписывать...

Имитация нажатия клавиш и кликов глобально - C#
можно ли средствами NET сэмулировать события мыши и клавиатуры вообще а не только для формы. например OnMouseClick для рабочего стола?

Как глобально перехватывать нажатия клавиш? - C# WPF
Как глобально перехватывать нажатия клавиш в WPF? Есть ли работающий пример? Погуглил нашел вот это пример но так и не разобрался...

Как перехватить событие нажатия кнопки "Завершение работы"? - VBScript/JScript
Хотелось бы написать скрипт Когда пользователь выбирает &quot;Завершение работы&quot;, появлялось сообщение &quot;Завершение&quot;, но как перехватить это...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.