获取微信qq等三方通知

NotificationListenerService使用方式

1.检测应用是否开启Notification access监听功能
private boolean isEnabled() { String pkgName = getPackageName(); final String flat = Settings.Secure.getString(getContentResolver(), ENABLED_NOTIFICATION_LISTENERS); if (!TextUtils.isEmpty(flat)) { final String[] names = flat.split(":"); for (int i = 0; i < names.length; i++) { final ComponentName cn = ComponentName.unflattenFromString(names[i]); if (cn != null) { if (TextUtils.equals(pkgName, cn.getPackageName())) { return true; } } } } return false; }
2.如果没有开启,开启Notification access监听功能

Intent intent = new   Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);

3.写一个类继承NotificationListenerService,并重写两个方法

 @Override
    public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
        Log.e("AAA", "=2==onNotificationPosted   ID :"
                + sbn.getId() + "\t"
                + sbn.getNotification().tickerText + "\t"
                + sbn.getPackageName());
    }

 @Override
    public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
        Log.e("AAA", "=4==onNotificationRemoved   ID :" 
                + sbn.getId() + "\t" 
                + sbn.getNotification().tickerText 
                + "\t" + sbn.getPackageName());
    }
    

4.注册服务和权限

 

            
                
            
            

第一大坑:
以上代码第一次运行可获得通知栏消息内容,但程序杀死后,再次启动,不能获得通知消息内容。
究其原因,看图说话:使用adb命令adb shell dumpsys notification,得到 All notification listeners(下图红线)和Live notification listeners(下图蓝线).我第一次启动,All notification listeners为3,Live notification listeners为2;第二次启动,All notification listeners为3,Live notification listeners为1,说明虽然我们Notification access监听功能依然开启,但监听的服务却是die.所以这就是再次启动程序,无反应的原因。
![](

![NYQG0)_IC%CWF2{LX]QY9EN.png](http://upload-images.jianshu.io/upload_images/2326838-7f046e72e1a9dfb2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)
解决办法:把应用的NotificationListenerService实现类disable再enable,即可触发系统rebind操作。

    private void toggleNotificationListenerService() {
        PackageManager pm = getPackageManager();
        pm.setComponentEnabledSetting(
                new ComponentName(this, com.notify.NotifyService.class),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(this, com.notify.NotifyService.class),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    }

后记:曾经尝试在自定义的service类里面,使用onbind方法,进行绑定服务,经验证无效。还有一大坑莫过于,用AS工具创建service,改成extends NotificationListenerService,改变服务及权限,经测试,依然无效。
这个问题长时间郁结我心,今日得破,甚是畅快。从accessibility---安卓的辅助功能,到今天的NotificationListenerService,曲折苦涩,个中滋味难以言表。多谢前辈们的指导,推荐:https://my.oschina.net/tingzi/blog/413666,教我使用NotificationListenerService;https://www.zhihu.com/question/33540416,帮我解决一个大坑。

你可能感兴趣的:(获取微信qq等三方通知)