2014-09-01 1 views
11

Je suis en train d'écrire une application d'accessibilité qui aide les utilisateurs à naviguer sur Android en utilisant un mélange de contrôles vocaux et de contrôles fournis par des outils d'aide externes. Il utilise l'API Java de MonkeyTalk pour faire le travail le plus lourd.
Pour aider l'utilisateur à propos de ce qui se passe, nous utilisons également un service d'accessibilité qui lit la notification afin que l'utilisateur puisse agir plus rapidement.Accessibilité Facebook messenger

m'a fait savoir qu'ils ne reçoivent aucune cue audio lorsqu'un message arrive sur le messager facebook, et vérifier les journaux ce que je vois est:

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

et event.getText().size() retours 0 (sur événement AccessibilityEvent).
À l'heure actuelle, ils doivent ouvrir l'application et obtenir le texte à lire, ce qui est 2 commandes vocales plus ...
Je reçois toutes les autres notifications correctement. J'ai essayé de chercher de la documentation sur Facebook à propos de leur position sur l'accessibilité mais je n'ai rien trouvé.
Existe-t-il un moyen d'obtenir le texte de leurs notifications?

Répondre

2

Vous pouvez essayer de voir si cela fonctionne avec Facebook notifications de messagerie. Et même si cela fonctionne, je suggère que vous attendiez une meilleure solution.

de l'API 19 et au-dessus, Notification transporter des objets empaquetés extras - les entrées passées à Notification.Builder lorsque le Notification a d'abord été créé. Ainsi, des informations telles que title, context, summary etc. peuvent être extraites de ce Bundle en utilisant les clés de la forme Notification.EXTRAS_XXXX. Les clés peuvent être trouvées ici: Link.

Dans la méthode onAccessibilityEvent(AccessibilityEvent event) overriden:

@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) peut être une méthode à partir d'ici: Link. Inutile de dire qu'il s'agit d'une solution de contournement, et qu'il faudra faire beaucoup de tests pour s'assurer que cela fonctionne comme requis.

+0

En ce moment, nous utilisons api19 +, donc c'est vraiment OK. À l'avenir, nous prendrons en charge les téléphones plus anciens, peut-être que je vais utiliser le tour de vue de gonfler, j'ai un peu aimé ça! – sokie

+1

Les champs supplémentaires se sont avérés parfaits! Je l'utilise aussi pour le reste des messages de notification. Merci! – sokie

+0

@sokie 'Je l'utilise aussi pour le reste des messages de notification. 'Impressionnant! Je n'ai pas pensé à te recommander de faire ça. – Vikram

0

Vous pouvez utiliser la méthode getActiveNotifications de NotificationListenerService pour obtenir un tableau de notifications qui sont visibles par l'utilisateur actuel. Le résultat est un tableau StatusBarNotification, vous pouvez donc lire le PackageName avec getPackageName et si elle correspond à ce que vous recherchez, puis obtenir le contenu de la notification de cet objet (avec getNotification) ...

Vous pouvez étendre NotificationListenerService classe et l'enregistrer en tant que service:

<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> 

vous pouvez également implémenter la méthode onNotificationPosted pour obtenir des notifications et même annuler les notifications avec la méthode cancelNotification.

Un exemple d'utilisation de ce service: https://github.com/kpbird/NotificationListenerService-Example

Remarque: L'utilisateur doit activer l'autorisation de notification "Paramètres> Sécurité> Accès de notification". Vous pouvez ouvrir ce paramètre avec:

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

Cela renvoie encore vide pour facebook messenger. – sokie

+0

Veuillez poster le code que vous avez utilisé. – semsamot

+0

Avez-vous essayé ce code avec facebook messenger? Je n'ai aucun problème pour accéder à toute autre notification, le seul qui renvoie vide est facebook messenger. – sokie