2014-09-01 7 views
11

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

Я был проинформирован, что они не получают никакой аудио реплику, когда сообщение поступает на facebook мессенджера и проверка журналов, что я вижу:

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

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

ответ

2

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

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

В перекрываться 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) может быть метод здесь: Link. Излишне говорить, что это обходное решение, и потребует довольно много тестирования, чтобы обеспечить его работу по мере необходимости.

+0

Прямо сейчас мы используем api19 +, так что все в порядке. В будущем мы будем поддерживать более старые телефоны, может быть, тогда я буду использовать трюк с видом раздувания, мне это понравилось! – sokie

+1

Дополнительные поля оказались безупречными! Я использую его сейчас и для остальных уведомлений. Спасибо! – sokie

+0

@sokie 'Я использую его сейчас для остальных уведомлений.' Awesome! Не думал рекомендовать вам сделать это. – Vikram

0

Вы можете использовать метод getActiveNotificationsNotificationListenerService, чтобы получить массив уведомлений, которые видны текущему пользователю. Результатом является StatusBarNotification массив, поэтому вы можете прочитать PACKAGENAME с 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

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

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

Это по-прежнему возвращает пустое сообщение для facebook messenger. – sokie

+0

Пожалуйста, разместите код, который вы использовали. – semsamot

+0

Пробовал ли вы этот код с помощью facebook messenger? У меня нет проблем с доступом к любому другому уведомлению, единственное, что возвращает пустое, - это facebook messenger. – sokie