Как обнаружить диалоговое окно питания в AccessibilityService

Я работаю над проектом, в котором нам нужно предупредить пользователя, когда отображается диалоговое окно питания. Чтобы отобразить диалоговое окно питания (диалоговое окно выключения/перезагрузки), мы используем AccessibilityService вместе с performGlobalAction(GLOBAL_ACTION_POWER_DIALOG). Это работает, однако, когда отображается это диалоговое окно, не возникает никаких других событий, даже несмотря на то, что мы поместили каждый отдельный тип события, тип обратной связи и флаг в файл accessibilityservice.xml. Это код, который у нас есть прямо сейчас:

Служба доступности:

@Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        Log.d("TESTING", "EVENT CODE: " + accessibilityEvent.getEventType()); //No event is happening when the power dialog is shown
        switch (accessibilityEvent.getEventType()){
            performGlobalAction(GLOBAL_ACTION_POWER_DIALOG);
        }
    }

доступностьservice.xml:

<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:packageNames="com.testingaccessibility"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:canRequestEnhancedWebAccessibility="true"
    android:canRequestFilterKeyEvents="true"
    android:canRequestTouchExplorationMode="true"/>

Как видите, я открываю диалоговое окно питания нажатием кнопки, и здесь можно предупредить пользователя, но я не могу этого сделать, когда пользователь долго нажимает кнопку питания.

Итак, можно ли отправить событие доступности при открытии диалогового окна питания?


person FewWords    schedule 10.02.2017    source источник
comment
, вы нашли какое-либо решение.??   -  person Anurag Goel    schedule 08.10.2018
comment
@AnuragGoel Я не нашел способа получить событие доступности при открытии диалогового окна питания. Однако, поскольку план состоял в том, чтобы автоматически перезагрузить телефон, я заснул на несколько секунд после вызова executeGlobalAction(GLOBAL_ACTION_POWER_DIALOG); а затем использовал getRootInActiveWindow(); чтобы убедиться, что диалоговое окно питания загружено. Затем я еще раз проверил, чтобы убедиться, что это правильный диалог, и, наконец, использовал PerformAction(AccessibilityNodeInfo.ACTION_CLICK); на детях, чтобы успешно перезагрузить телефон.   -  person FewWords    schedule 08.10.2018
comment
@FewWords, не могли бы вы сообщить мне, как вы выполняете событие щелчка. Я могу захватить окно питания, но все узлы не кликабельны. Если у вас есть фрагмент того, как вы это сделали, это будет очень полезно.   -  person Ajay nath    schedule 16.05.2020
comment
@Ajaynath Ну, как я уже сказал в комментарии выше. Я использовал PerformAction(AccessibilityNodeInfo.ACTION_CLICK). Однако это было 3 года назад, и многое изменилось, поэтому, если это больше не вариант, я не могу вам помочь. У меня больше нет доступа к этому коду, и я точно не помню, как я это сделал, извините   -  person FewWords    schedule 04.06.2020
comment
@FewWords Нет проблем, спасибо.   -  person Ajay nath    schedule 10.01.2021


Ответы (1)


в службе специальных возможностей измените метод onAccessibilityEvent...

@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    Log.d("TESTING", "EVENT CODE: " + accessibilityEvent.getEventType()); //No event is happening when the power dialog is shown
    if(accessibilityEvent.getText().equalsIgnoreCase("check for power dialog content text")){


       /***do your work***/
    }
}
person BHARADWAJ Marripally    schedule 05.05.2017