Android NotificationListenerService onNotificationPosted fire twice

无人久伴 提交于 2019-12-01 18:03:51

I'm not sure why this happens. Maybe flags of notifications could be triggering it twice.

You can try to omit duplicate executing yourself:

public class NotifyService extends NotificationListenerService {
    private String mPreviousNotificationKey;
    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        if(TextUtils.isEmpty(mPreviousNotification) || !TextUtils.isEmpty(mPreviousNotification) && !sbn.getKey().equals(mPreviousNotificationKey)){
        Log.i("NotifyService", "got notification");
    }
}

Each StatusBarNotification has unique key which is generated:

private String key() {
   return user.getIdentifier() + "|" + pkg + "|" + id + "|" + tag + "|" + uid;

}

Holding each previous key can distinguish latter notification for given package.

Facing Same Problem For Whatsapp Notification

I just solve this by generating new key with statusBarNotification.key + statusBarNotification.title

Now store this key in my SQLiteDatabase

code written in Kotlin

 override fun onNotificationPosted(sbn: StatusBarNotification?) {
        if(sbn?.tag!=null) 
        {
        var key = sbn?.key ?: null
        var id = sbn?.id
        var postTime = sbn?.postTime
        var packageName = sbn?.packageName ?: null
        var tikerText = sbn?.notification?.tickerText ?: null

        var extraBundle: Bundle? = sbn?.notification?.extras ?: null
        var notificationTitle = extraBundle?.get(Notification.EXTRA_TITLE)
        var text = extraBundle?.getCharSequence(Notification.EXTRA_TEXT).toString()

        var modifiyedUniq = key + notificationTitle

        //check key present in database or not
        if (!databaseHandler.checkNotification(modifiyedUniq!!)) 
         {
            Log.e(TAG, "Notification Key :: ${key}")
            Log.e(TAG, "Notification Id :: ${id}")
            Log.e(TAG, "Notification postTime :: ${postTime}")
            Log.e(TAG, "Notification From :: ${packageName}")
            Log.e(TAG, "Notification TikerText :: ${tikerText}")
            Log.e(TAG, "Notification Title :: ${notificationTitle}")
            Log.e(TAG, "Notification Text :: ${text}")
            //now add this record in database
            databaseHandler.addNotification(notificationData)
         }
        }
 }

this method databaseHandler.checkNotification(modifiyedUniq!!) returns true if record present with this key else it returns false

each and every time checking the key if no record present means its new notification

fun checkNotification(key: String): Boolean {
    var isPresent: Boolean = false
    val db = readableDatabase
    val selectALLQuery = "SELECT * FROM $TABLE_NAME WHERE $KEY='${key}'"
    val cursor = db.rawQuery(selectALLQuery, null)
    if (cursor != null) {
        if (cursor.count > 0) {
            cursor.close()
            db.close()
            Log.e("","====================================RECORD PRESEBNT=======================")
            return true
        }
    }
    cursor.close()
    db.close()
    Log.e("","===*******=======********=====RECORD NOT PRESENT===*******=======********=====")
    return isPresent
}

Notification 0|com.whatsapp|1|XX2X606878@s.whatsapp.net|10171

tag = 91XX06X78@s.whatsapp.net

Notification Id :: 1
Notification postTime :: 15464X794103
Notification From :: com.whatsapp
Notification TikerText :: null
Notification Title :: XXX X Bca (2 messages): ​
Notification Text :: XXXXX(last new Message)

This issue happened to me too. My workaround is to use notification's time + (notification's title + notification's text) as two keys.

If time is not older than 1 sec and similar title + text then ignore.

if (Calendar.getInstance().getTimeInMillis() - lastMessageTime < 1000 && lastMessageContent.equalsIgnoreCase(title + text)) {
        // Ignore
        return;
    } else {
        lastMessageContent = title + text;
        lastMessageTime = Calendar.getInstance().getTimeInMillis();
    }

I worked for me but I think it may missed some notification.

Hitesh Manwani

Using Split you can achieve this thing.

 String[] separated = Your Notification key.split("\\|");
    if (!separated[3].equalsIgnoreCase("null")){//Add Your Data in list or DB }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!