11

我正在编写一个辅助功能应用程序,它可以帮助用户使用语音控件和通过外部辅助工具提供的控件的组合在 android 上导航。它使用 MonkeyTalk Java API 来完成较重的工作。
为了帮助用户了解正在发生的事情,我们还使用了无障碍服务,它会读取通知,以便用户可以更快地采取行动。

我被告知,当消息到达 facebook Messenger 时,他们没有收到音频提示,并且检查日志我看到的是:

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

event.getText().size()返回 0(在 AccessibilityEvent 事件中)。
现在他们必须打开应用程序并将文本朗读给他们,这是另外 2 个语音命令......
我正确地收到了所有其他通知。我尝试从 facebook 查找有关他们对可访问性的立场的文档,但我一无所获。
有没有办法从他们的通知中获取文本?

4

2 回答 2

2

你可以试试这个,看看它是否适用于 Facebook Messenger 通知。即使这确实有效,我建议您等待更好的解决方案。

从 API 19 及更高版本开始,Notification对象携带捆绑-首次创建时extras传递的输入。因此,可以使用 form 的键从中提取 , 等信息。可以在此处找到密钥:链接Notification.BuilderNotificationtitlecontextsummaryBundleNotification.EXTRAS_XXXX

在重写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。不用说,这是一种解决方法,并且需要进行大量测试以确保它按要求工作。

于 2014-09-05T22:06:42.570 回答
0

您可以使用getActiveNotificationsof 方法NotificationListenerService获取当前用户可见的通知数组。结果是一个StatusBarNotification数组,因此您可以读取 PackageName ,getPackageName如果它与您正在寻找的匹配,则从该对象获取通知内容(使用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);
于 2014-09-03T10:04:38.057 回答