Доступность сообщений в Facebook

Я пишу приложение доступности, которое помогает пользователям перемещаться по андроиду, используя смесь голосовых средств управления и элементов управления, предоставляемых с помощью внешних инструментов помощи. Он использует API-интерфейс MonkeyTalk для выполнения более тяжелой работы.
Чтобы помочь пользователю в том, что происходит, мы также используем службу доступности, которая считывает уведомление, чтобы пользователь мог быстрее действовать.

Мне сообщили, что они не получают звуковой сигнал, когда сообщение приходит на facebook messenger и проверяет журналы, что я вижу:

D/NotificationService(2665): package com.facebook.orcaText: []

и event.getText().size() возвращает 0 (событие AccessibilityEvent).
Прямо сейчас они должны открыть приложение и получить прочитанный текст, что еще 2 голосовых команды... Я получаю все остальные уведомления правильно. Я попытался найти документацию из facebook об их позиции по доступности, но я ничего не нашел. Есть ли способ получить текст из своих уведомлений?

Ответ 1

Вы можете попробовать это, чтобы узнать, работает ли оно с уведомлениями Facebook-мессенджера. И даже если это сработает, я предлагаю вам подождать лучшего решения.

От API 19 и выше, объекты Notification несут в комплекте extras - входы, переданные в Notification.Builder, когда сначала был создан Notification. Таким образом, из этого Bundle можно извлечь информацию, такую ​​как title, context, summary и т.д., Используя ключи формы Notification.EXTRAS_XXXX. Ключи можно найти здесь: Ссылка.

В методе override onAccessibilityEvent(AccessibilityEvent event):

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    Parcelable data = event.getParcelableData();

    if (data != null && data instanceof Notification) {
        Log.i("", "We have a notification to parse");

        Notification notification = (Notification) data;

        // For API 19 and above, `Notifications` carry an `extras` bundle with them
        // From this bundle, you can extract info such as:

        //      `EXTRA_TITLE`     -  as supplied to setContentTitle(CharSequence)
        //      `EXTRA_TEXT `     -  as supplied to setContentText(CharSequence)
        //      `EXTRA_INFO_TEXT` -  as supplied to setContentInfo(CharSequence)
        //      ... more at: http://developer.android.com/reference/android/app/Notification.html

        Bundle b = noti.extras;
        Log.i("Notification", "Title: " + b.get(Notification.EXTRA_TITLE));
        Log.i("Notification", "Text: " + b.get(Notification.EXTRA_TEXT));
        Log.i("Notification", "Info Text: " + b.get(Notification.EXTRA_INFO_TEXT));

        /////////////////////////////////////////////////////////////////

        // For API 18 and under:

        // Pass `notification` to a method that parses a Notification object - See link below

        List<String> notificationText = extractTextFromNotification(notification);
        ....
        ....
    }
}

extractTextFromNotification(Notification) может быть методом отсюда: Ссылка. Излишне говорить, что это обходной путь, и потребует довольно много тестирования, чтобы обеспечить его работу по мере необходимости.

Ответ 2

Вы можете использовать getActiveNotifications метод NotificationListenerService, чтобы получить массив уведомлений, которые видны текущему пользователю. Результатом является массив StatusBarNotification. Таким образом, вы можете прочитать имя пакета с помощью getPackageName и, если оно соответствует тому, которое вы ищете, затем получить содержимое уведомлений с этого объекта (с помощью getNotification)...

Вы можете расширить класс NotificationListenerService и зарегистрировать его как службу:

<service android:name=".NotificationListener"
      android:label="@string/service_name"
      android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
 <intent-filter>
     <action android:name="android.service.notification.NotificationListenerService" />
 </intent-filter>
</service>

Также вы можете реализовать метод onNotificationPosted для получения уведомлений и даже отмены уведомлений с помощью метода cancelNotification.

Пример использования этой службы: https://github.com/kpbird/NotificationListenerService-Example

Примечание: Пользователь должен включить разрешение уведомлений из "Настройки > Безопасность > Доступ к уведомлению". Вы можете открыть этот параметр с помощью:

Intent intent=new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);