2012-02-20 85 views
28

在我正在开发的Android应用程序中,我希望能够检测何时出现新的状态栏通知,而不管它是否是由我的应用程序引起的。具体来说,我想计算给定时间范围内的通知数量。检测新的Android通知

这甚至是可能的,如果是这样,怎么样?

回答

52

其实,这是可能的,我在我的应用程序中使用它。

您需要注册一个AccessibilityService并确保用户启用服务。

示例服务:

public class InstantMessenger extends AccessibilityService { 

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { 
     //Do something, eg getting packagename 
     final String packagename = String.valueOf(event.getPackageName()); 
} 
} 

@Override 
protected 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; 
} 

@Override 
public void onInterrupt() { 
    isInit = false; 
} 
} 

Example for checking if your Service is activated

+0

这很酷。不知道。谢谢! – koopaking3 2012-03-09 17:11:30

+12

@Sean注意:要启动“AccessibilityService”,用户需要打开设置 - 辅助功能,启用辅助功能,然后单独启用您的服务。此时,他们会收到以下消息:“此无障碍服务可能能够收集您键入的所有文本,包括除密码之外的个人数据信用卡,还可能会记录您的用户界面交互,它来自应用程序xxx 。 使用...?”除非您将此用于个人用途或商业用途,否则这可能会对市场用户产生很大的信任。只是想给你一个大的图片 – koopaking3 2012-03-09 17:13:17

+1

并不意味着你不应该使用它,只是在开始投入工作之前意识到建立你自己的 – koopaking3 2012-03-09 17:14:35

19

Notification Listener API在采用Android 4.3可让您做到这一点。

有了这个,对辅助功能攻击的需求就减少了。它也允许你关闭通知。

+0

通知侦听器尚未完全工作,例如,您无法从Google导航更新中检索文本(总是返回null)。这意味着可访问性'hack'仍然有用 – Fuzzy 2014-04-20 08:40:35

+0

将其更改为“less need”而不是“no need” – thoutbeckers 2014-04-22 10:53:31

+0

是否可以*以任何方式更改通知?我想使应用程序的通知无法通过该应用程序提取 – squirrel 2015-06-18 19:18:53