獲取微信qq等三方通知

NotificationListenerService使用方式

1.檢測應(yīng)用是否開啟Notification access監(jiān)聽功能
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監(jiān)聽功能

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

3.寫一個(gè)類繼承NotificationListenerService,并重寫兩個(gè)方法

 @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.注冊(cè)服務(wù)和權(quán)限

 <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>

第一大坑:
以上代碼第一次運(yùn)行可獲得通知欄消息內(nèi)容,但程序殺死后,再次啟動(dòng),不能獲得通知消息內(nèi)容。
究其原因,看圖說話:使用adb命令adb shell dumpsys notification,得到 All notification listeners(下圖紅線)和Live notification listeners(下圖藍(lán)線).我第一次啟動(dòng),All notification listeners為3,Live notification listeners為2;第二次啟動(dòng),All notification listeners為3,Live notification listeners為1,說明雖然我們Notification access監(jiān)聽功能依然開啟,但監(jiān)聽的服務(wù)卻是die.所以這就是再次啟動(dòng)程序,無反應(yīng)的原因。
![](

![NYQG0)_IC%CWF2{LX]QY9EN.png](http://upload-images.jianshu.io/upload_images/2326838-7f046e72e1a9dfb2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)
解決辦法:把應(yīng)用的NotificationListenerService實(shí)現(xiàn)類disable再enable,即可觸發(fā)系統(tǒng)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);
    }

后記:曾經(jīng)嘗試在自定義的service類里面,使用onbind方法,進(jìn)行綁定服務(wù),經(jīng)驗(yàn)證無效。還有一大坑莫過于,用AS工具創(chuàng)建service,改成extends NotificationListenerService,改變服務(wù)及權(quán)限,經(jīng)測試,依然無效。
這個(gè)問題長時(shí)間郁結(jié)我心,今日得破,甚是暢快。從accessibility---安卓的輔助功能,到今天的NotificationListenerService,曲折苦澀,個(gè)中滋味難以言表。多謝前輩們的指導(dǎo),推薦:https://my.oschina.net/tingzi/blog/413666,教我使用NotificationListenerService;https://www.zhihu.com/question/33540416,幫我解決一個(gè)大坑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容