Значение различных типов обратной связи для службы специальных возможностей в Android?

Я работал над приложением, которое отображает все уведомления в строке состояния телефона (например, новое сообщение или пропущенный звонок). Проведя исследования, я обнаружил, что единственный способ сделать это в Android - это создать службу доступности. Поэтому я сделал то же самое, получив AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED в моей службе специальных возможностей.
Вот мой метод onServiceConnected ():

public void onServiceConnected(){
    if (isInit) {
        return;
    }
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    setServiceInfo(info);
    isInit = true;
}

Это работает, но не совсем так. На самом деле он показывает много уведомлений, которых нет в строке состояния и которые, вероятно, генерируются фоновыми приложениями, которые мне не нужны. Также это не в реальном времени. Он обновляется, только когда я повторно открываю приложение, а не когда оно открыто. Кроме того, как только я запускаю службу в настройках, мой телефон (галактическая нота) начинает говорить все. Не уверен, что это ошибка или какая-то проблема в коде.
Я не могу понять, где именно проблема, но я думаю, что это может быть тип обратной связи. Я много пробовал, но нигде не мог понять, что означают разные типы обратной связи для сервиса.

FEEDBACK_AUDIBLE
FEEDBACK_HAPTIC
FEEDBACK_AUDIBLE
FEEDBACK_VISUAL
FEEDBACK_GENERIC

Подскажите, пожалуйста, что означают эти типы обратной связи? И буду ли я получать другие уведомления, если изменю тип обратной связи? И если вы считаете, что я иду в неправильном направлении, пожалуйста, объясните мне, что я могу сделать для решения этих проблем. Дай мне знать, если я забыл предоставить важную информацию.

Будем очень благодарны за любую помощь.


person Anjani    schedule 02.11.2013    source источник


Ответы (1)


Что ж, у меня нет ответов на все ваши вопросы, но я могу вам кое-что помочь. Как вы упомянули, вам нужны только уведомления в строке состояния, а не другие, например тосты и все такое. Поэтому для этой цели вы можете попробовать следующий код в своем сервисе.

public void onAccessibilityEvent(AccessibilityEvent event) {
    final int eventType = event.getEventType();
    if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
        Parcelable parcelable = event.getParcelableData();

        if(parcelable instanceof Notification){
            // statusbar notification
            List<CharSequence> messages = event.getText();
            if (messages.size() > 0) {
                // here you can do whatever you want with the notification.
                //Log.d(tag, "Saved event");
            }
        }
    }
}

Также установите тайм-аут в своем onServiceConnected следующим образом:

info.notificationTimeout=100;  

Надеюсь, у вас это сработает.

person user2991155    schedule 14.11.2013
comment
Это помогло мне получить уведомления в строке состояния. Спасибо, что ответили. Как я уже упоминал ранее, основная проблема, с которой я столкнулся сейчас, - это мой говорящий телефон. Думаю, это ошибка в андроиде. Буду очень признателен, если вы можете мне с этим помочь. - person Anjani; 14.11.2013
comment
Похоже, вы включили службу специальных возможностей TalkBack в настройках специальных возможностей? - person tommed; 20.01.2016
comment
ваш код был полезен, но я столкнулся с проблемой. даже этот код не решил ее. то, с чем я сталкиваюсь, это то, что всякий раз, когда уведомление появляется в строке состояния уведомлений. мой метод onAccessibilityEvent(AccessibilityEvent) вызывается дважды, и я проверял его на многих устройствах. он вызывается дважды. поэтому все, что я делаю в onAccessibilityEvent(AccessibilityEvent), повторяется дважды из-за этого. Может ли кто-нибудь помочь мне решить эту проблему? - person Akash Raghav; 22.01.2016
comment
Я могу записать входящее сообщение ussd, но как сравнить входящее сообщение ussd в случае телефона с двумя SIM-картами? означает, что если я получаю уведомление о сообщении ussd, то как я могу узнать, что входящее сообщение ussd предназначено для какой sim-карты? - person Sachin Arora; 04.06.2016
comment
@AkashRaghav У меня такая же проблема, из-за некоторых уведомлений onAccessibilityEvent срабатывает дважды. Вы нашли решение? - person Denny; 30.03.2017