2014-09-01 26 views
11

Sto scrivendo un'app di accessibilità che aiuta gli utenti a navigare su Android utilizzando una combinazione di controlli vocali e controlli forniti da strumenti di supporto esterni. Usa l'API MonkeyTalk Java per fare il lavoro più pesante.
Per aiutare l'utente su ciò che sta accadendo, utilizziamo anche un servizio di accessibilità, che legge la notifica in modo che l'utente possa agire più rapidamente.Accesso a Facebook Messenger

sono stato informato che non ottengono spunto audio quando arriva un messaggio su facebook messenger, e controllando i registri Quello che vedo è:

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

e event.getText().size() restituisce 0 (su evento AccessibilityEvent).
In questo momento devono aprire l'app e leggere il testo, 2 comandi vocali in più ...
Ottengo tutte le altre notifiche correttamente. Ho provato a cercare la documentazione di Facebook sulla loro posizione sull'accessibilità, ma non ho trovato nulla.
C'è un modo per ottenere il testo dalle loro notifiche?

risposta

2

Si può provare questo per vedere se funziona con Facebook notifiche di Messenger. E anche se questo funziona, ti suggerirei di aspettare una soluzione migliore.

Da API 19 e sopra, Notification oggetti carry bundle extras - ingressi passati Notification.Builder quando il Notification stato creato. Quindi, informazioni come title, context, summary ecc. Possono essere estratte da questo Bundle utilizzando le chiavi del modulo Notification.EXTRAS_XXXX. Le chiavi possono essere trovate qui: Link.

Nel onAccessibilityEvent(AccessibilityEvent event) metodo soprascritta:

@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) può essere un metodo da qui: Link. Inutile dire che questa è una soluzione alternativa e richiederà un bel po 'di test per garantire che funzioni come richiesto.

+0

In questo momento usiamo api19 +, quindi è tutto ok. In futuro sosterremo i telefoni più vecchi, forse poi userò il trucco di visualizzazione del gonfiaggio, mi è piaciuto! – sokie

+1

I campi extra hanno dimostrato di funzionare perfettamente! Lo sto usando anche per il resto dei messaggi di notifica. Grazie! – sokie

+0

@sokie 'Lo sto usando ora anche per il resto dei messaggi di notifica. Fantastico! Non ho pensato di raccomandarti di farlo. – Vikram

0

È possibile utilizzare il metodo getActiveNotifications di NotificationListenerService per ottenere un array di notifiche visibili all'utente corrente. Il risultato è un array StatusBarNotification, così si può leggere il PackageName con getPackageName e se corrisponde a quello che si sta cercando, quindi ottenere il contenuto notifica da quell'oggetto (con getNotification) ...

È possibile estendere NotificationListenerService classe e registrarlo come servizio:

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

Inoltre è possibile implementare onNotificationPosted metodo per ottenere le notifiche e addirittura annullare le notifiche con cancelNotification metodo.

Un esempio di utilizzo di questo servizio: https://github.com/kpbird/NotificationListenerService-Example

Nota: utente deve attivare l'autorizzazione notifica da "Impostazioni> Sicurezza> accesso Notifica". È possibile aprire questa impostazione con:

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

Questo restituisce ancora vuoto per Facebook Messenger. – sokie

+0

Per favore pubblica il codice che hai usato. – semsamot

+0

Hai provato questo codice con facebook messenger? Non ho problemi ad accedere ad altre notifiche, l'unico che restituisce vuoto è facebook messenger. – sokie

Problemi correlati