2014-09-01 12 views
11

Ich schreibe eine Accessibility-App, die Benutzern hilft, auf Android mit einer Mischung aus Sprachsteuerungen und Steuerelementen navigieren, die über externe Hilfstools bereitgestellt werden. Es verwendet MonkeyTalk Java API, um die schwerere Arbeit zu erledigen.
Um dem Benutzer zu helfen, was passiert, verwenden wir auch einen Accessibility-Service, der Benachrichtigungen liest, damit der Benutzer schneller handeln kann.Facebook Messenger Erreichbarkeit

ich worden bin darüber informiert, dass sie keinen Audio-Cue bekommen, wenn eine Nachricht auf Facebook Boten ankommt, und die Überprüfung Protokolle, was ich sehe, ist:

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

und event.getText().size() 0 zurück (auf AccessibilityEvent Ereignisse).
Jetzt müssen sie die App öffnen und den Text lesen, der 2 Sprachbefehle mehr ist ...
Ich bekomme alle anderen Benachrichtigungen korrekt. Ich habe versucht, auf Facebook nach einer Dokumentation über ihre Haltung zur Barrierefreiheit zu suchen, aber ich habe nichts gefunden.
Gibt es eine Möglichkeit, den Text von ihren Benachrichtigungen zu erhalten?

Antwort

2

du versuchen, um zu sehen, ob es mit Facebook Messenger Benachrichtigungen funktioniert. Und selbst wenn das funktioniert, würde ich vorschlagen, dass Sie auf eine bessere Lösung warten.

Von 19 API und oben, tragen Notification Objekte gebündelt extras - die zu Notification.Builder bestanden Eingänge, wenn die Notification zuerst erstellt wurde. So können Informationen wie die title, context, summary usw. aus dieser Bundle mit Schlüsseln der Form Notification.EXTRAS_XXXX extrahiert werden. Die Schlüssel finden Sie hier: Link.

Im außer Kraft gesetzt onAccessibilityEvent(AccessibilityEvent event) Methode:

@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) kann ein Verfahren von hier sein: Link. Unnötig zu sagen, dass dies eine Umgehungslösung ist und eine ganze Reihe von Tests erfordert, um sicherzustellen, dass es wie gewünscht funktioniert.

+0

Gerade jetzt benutzen wir api19 +, also ist es wirklich okay. In der Zukunft werden wir ältere Telefone unterstützen, vielleicht werde ich dann den Inflate View-Trick verwenden, das hat mir irgendwie gefallen! – sokie

+1

Die zusätzlichen Felder haben sich als perfekt erwiesen! Ich benutze es jetzt auch für den Rest der Benachrichtigungen. Danke! – sokie

+0

@sokie 'Ich benutze es jetzt auch für den Rest der Benachrichtigungen. Ich habe nicht daran gedacht, dir das zu empfehlen. – Vikram

0

Sie können getActiveNotifications Methode von NotificationListenerService verwenden, um ein Array von Benachrichtigungen zu erhalten, die für den aktuellen Benutzer sichtbar sind. Das Ergebnis ist ein StatusBarNotification Array, also können Sie die Package mit getPackageName lesen, und wenn es mit dem übereinstimmt, für den Sie suchen, dann die Benachrichtigung Inhalt von diesem Objekt erhalten (mit getNotification) ...

Sie können NotificationListenerService erweitern Klasse und registrieren Sie es als Dienstleistung:

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

Sie können auch onNotificationPosted Verfahren implementieren, um Benachrichtigungen zu erhalten und sogar Benachrichtigungen mit cancelNotification Verfahren abzubrechen.

Ein Beispiel für die Nutzung dieser Dienstleistung: https://github.com/kpbird/NotificationListenerService-Example

Hinweis: Benutzer muss Benachrichtigung Erlaubnis von "Einstellungen> Sicherheit> Benachrichtigungszugriff" aktivieren. Sie können diese Einstellung öffnen mit:

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

Dies ist immer noch leer für Facebook Messenger. – sokie

+0

Bitte schreiben Sie den Code, den Sie verwendet haben. – semsamot

+0

Haben Sie diesen Code mit Facebook Messenger getestet? Ich habe kein Problem, auf eine andere Benachrichtigung zuzugreifen, die einzige, die leer zurückkehrt, ist Facebook Messenger. – sokie