Facebook Messenger的可访问性

我正在编写一个辅助function应用程序,帮助用户使用语音控件和通过外部辅助工具提供的控件混合使用Android进行导航。 它使用MonkeyTalk Java API来做更重的工作。
为了帮助用户了解正在发生的事情,我们还使用辅助function服务,该服务读取通知,以便用户更快地采取行动。

我已经被告知,当一个消息到达facebook messenger时,他们得不到audio提示,并且检查日志我看到的是:

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

event.getText().size()返回0(在AccessibilityEvent事件上)。
现在,他们必须打开应用程序,并获得文本阅读给他们,这是2个语音命令更多…
我正确地得到所有其他通知。 我试图从Facebook的文件寻找关于他们的可访问性的立场,但我什么也没find。
有没有办法从他们的通知中获取文本?

Solutions Collecting From Web of "Facebook Messenger的可访问性"

你可以试试看看它是否适用于Facebook Messenger的通知。 即使这样做,我build议你等待一个更好的解决scheme。

从API 19及以上版本开始, Notification对象携带捆绑的extras – 在Notification首次创build时传递给Notification.Builder的input。 因此,可以使用Notification.EXTRAS_XXXX格式的键从这个Bundle提取诸如titlecontextsummary等信息。 钥匙可以在这里find: 链接 。

在覆盖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)可以从这里的方法: 链接 。 毋庸置疑,这是一个解决方法,并将需要相当多的testing,以确保它按要求工作。

您可以使用NotificationListenerService getActiveNotifications方法来获取当前用户可见的通知数组。 结果是一个StatusBarNotification数组,所以你可以用getPackageName读取PackageName,如果它与你正在查找的匹配,那么从该对象获取通知内容(使用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);