7

我一直在开发一个在手机状态栏中显示所有通知的应用程序(如新消息或未接来电)。通过研究,我发现在 android 中做到这一点的唯一方法是创建一个可访问性服务。所以我通过在我的辅助功能服务中获取 AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED 做了同样的事情。
这是我的 onServiceConnected() 方法:

public void onServiceConnected(){
    if (isInit) {
        return;
    }
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    setServiceInfo(info);
    isInit = true;
}

这是有效的,但不完全是我希望的。它实际上显示了许多不在状态栏中的通知,并且可能是由我不想要的后台应用程序生成的。它也不是实时的。它仅在我重新打开应用程序时更新,而不是在应用程序打开时更新。此外,只要我在设置中启动服务,我的手机(银河笔记)就会开始说话。不确定这是代码中的错误还是某些问题。
我无法弄清楚问题到底出在哪里,但我认为它可能是反馈类型。我尝试了很多,但在任何地方都找不到服务的不同反馈类型的含义。

FEEDBACK_AUDIBLE
FEEDBACK_HAPTIC
FEEDBACK_AUDIBLE
FEEDBACK_VISUAL
FEEDBACK_GENERIC

有人可以告诉我这些反馈类型意味着什么吗?如果我更改反馈类型,我会收到不同的通知吗?如果您认为我走错了方向,请指导我如何解决这些问题。如果我忘记提供一些重要信息,请让我知道。

任何形式的帮助将非常感激。

4

1 回答 1

1

好吧,我没有你所有问题的答案,但我可以帮助你一些事情。正如您所提到的,您只需要状态栏通知,而不需要其他类似 toasts 的通知。因此,为此目的,您可以在您的服务中尝试以下代码。

public void onAccessibilityEvent(AccessibilityEvent event) {
    final int eventType = event.getEventType();
    if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
        Parcelable parcelable = event.getParcelableData();

        if(parcelable instanceof Notification){
            // statusbar notification
            List<CharSequence> messages = event.getText();
            if (messages.size() > 0) {
                // here you can do whatever you want with the notification.
                //Log.d(tag, "Saved event");
            }
        }
    }
}

还像这样在 onServiceConnected 中设置超时:

info.notificationTimeout=100;  

我希望这个对你有用。

于 2013-11-14T08:41:48.230 回答