Событие копирования буфера обмена AccessibilityService

Я пытаюсь заставить AccessibilityService получать уведомления о событии копирования буфера обмена.

До сих пор я пытался обойти проблему, чтобы служба уведомлялась после нажатия кнопки «Копировать» во всплывающем окне, но в этой ситуации не возникает никаких событий, я проверил все основные события (выбор текста, щелчок типа просмотра и т. )

Есть ли возможность этого добиться?


person Jakub Jabłoński    schedule 12.12.2017    source источник


Ответы (1)


Службы специальных возможностей не получают это событие. Что вы можете сделать, так это проверить содержимое буфера обмена после некоторого подмножества событий доступности.

@Override
public void onAccessibilityEvent(AccessibilityEvent e) {

    switch (e.getEventType()) {
        //This event alone may be enough!
        case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:

        // If not fall through for these events as well, which would detect things like a "Copy" button activated.
        case AccessibilityEvent.TYPE_VIEW_CLICKED:
        case AccessibilityEvent.TYPE_VIEW_CONTEXT_CLICKED:
            checkContentsOfClipboard();

    }
}
person ChrisCM    schedule 13.12.2017
comment
Многие приложения, такие как читатели PDF, Chrome, реализуют свои собственные текстовые контейнеры, которые не вызывают событие изменения выбора, другие тоже не выбрасываются из того, что я тестировал. - person Jakub Jabłoński; 13.12.2017
comment
Поэтому я предложил следить и за другими событиями. Падение проверит изменение выбора ИЛИ просмотр кликов или просмотр контекстных событий кликов. Это должно быть подмножество событий, которые могут вызвать изменение. Вы всегда можете просто следить за всеми событиями и всегда проверять изменения в буфере обмена... если вашим клиентам не важно время автономной работы. - person ChrisCM; 13.12.2017
comment
Если вы не отлавливаете эти события, у вас проблема в другом месте. Эти события выбрасываются просто отлично. Если кто-то не использует аппаратную клавиатуру для копирования, которая принципиально отличается, кто-то должен был взаимодействовать с кнопкой копирования в ОС, что вызовет событие специальных возможностей VIEW_CLICKED. Хитрость заключается в том, чтобы правильно его слушать. - person ChrisCM; 13.12.2017
comment
Действительно, система, эмулируемая студией Android, не корректно отбрасывала события, после локального тестирования на моем собственном телефоне выяснилось, что она работает, спасибо! - person Jakub Jabłoński; 14.12.2017
comment
Начиная с Android 10, вы даже не можете проверить содержимое буфера обмена, сколько бы событий у вас ни было. Ваше приложение должно быть сфокусировано, чтобы добраться до буфера обмена. - person android developer; 26.05.2020