我正在编写一个辅助功能应用程序,该应用程序使用语音控件和通过外部辅助工具提供的控件来帮助用户在android上导航。它使用MonkeyTalk Java API来完成更繁重的工作
为了帮助用户了解正在发生的事情,我们还使用了可访问性服务,该服务读取通知,以便用户可以更快地采取行动。
我被告知,当消息到达facebook信使时,他们没有得到音频提示,检查日志我看到的是:
D/NotificationService(2665): package com.facebook.orcaText: []
CCD_ 1(在AccessibilityEvent事件上)返回0
现在,他们必须打开应用程序并读取文本,这是两个语音命令
我正确地收到了所有其他通知。我试着从脸书上寻找关于他们对无障碍性立场的文件,但一无所获
有没有办法从他们的通知中获取文本?
您可以尝试一下,看看它是否适用于Facebook信使通知。即使这确实有效,我建议你等待更好的解决方案。
从API 19及更高版本中,Notification
对象携带绑定的extras
,即首次创建Notification
时传递给Notification.Builder
的输入。因此,可以使用形式为event.getText().size()
0的密钥从该Bundle
提取诸如title
、context
、summary
等的信息。钥匙可以在这里找到:链接。
在被否决的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。不用说,这是一种变通方法,需要进行大量测试才能确保它按要求工作。
您可以使用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>
此外,您还可以使用cancelNotification
方法实现onNotificationPosted
方法来获取通知,甚至取消通知。
使用此服务的示例:https://github.com/kpbird/NotificationListenerService-Example
注意:用户必须从"设置>安全>通知访问"启用通知权限。您可以使用打开该设置
Intent intent=new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);