美文网首页
获取微信qq等三方通知

获取微信qq等三方通知

作者: 若兮生生 | 来源:发表于2016-11-01 13:42 被阅读2077次

    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.注册服务和权限

     <service android:name=".NotifyService"
                android:label="@string/app_name"
                android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    
                <intent-filter>
                    <action android:name="android.service.notification.NotificationListenerService" />
                </intent-filter>
                <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"   
            </service>
    
    

    第一大坑:
    以上代码第一次运行可获得通知栏消息内容,但程序杀死后,再次启动,不能获得通知消息内容。
    究其原因,看图说话:使用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](https://img.haomeiwen.com/i2326838/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等三方通知

          本文链接:https://www.haomeiwen.com/subject/ybrmuttx.html