问题
I know this looks like a duplicate of Android NotificationListenerService onNotificationPosted fire twice and NotificationListenerService onNotificationPosted() called multiple times for single Notification when it is part of grouped notification, but I have tried their solutions and they don't seem to work.
All I want to do is to have a background service that is counting the number of notifications a person gets on the phone and then just write that into a text file.
It works fine for SMS and Hangout notifications (i.e. it is fired only once for each notification) but when I test it using WhatsApp and Gmail, it gets fired twice and so, for each Gmail notification, I have two rows in my text file.
Here is my code. Any help will be appreciated.
public class NotifCounterService extends NotificationListenerService {
public static String TAG = NotifCounterService.class.getSimpleName();
Date dateStart;
private Logger logger;
private Context mContext;
@Override
public void onCreate() {
Log.d(TAG, "Created");
logger = new Logger(TAG);
mContext = getApplicationContext();
}
@Override
public IBinder onBind(Intent intent) {
return super.onBind(intent);
}
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
Log.d(TAG, "Notification has arrived");
Log.d(TAG, "ID: " + sbn.getId() + " Posted by: " + sbn.getPackageName() + " at: " + sbn.getPostTime() + " ");
logger.i(sbn.getId() + "," + sbn.getPackageName() + "," + sbn.getPostTime(), mContext);
logger.close();
/*
* Log.i(TAG, "ID:" + sbn.getId()); Log.i(TAG, "Posted by:" +
* sbn.getPackageName()); Log.i(TAG, "tickerText:" +
* sbn.getNotification().tickerText);
*/
/*
* for (String key : sbn.getNotification().extras.keySet()) { Log.i(TAG, key +
* "=" + sbn.getNotification().extras.get(key).toString()); }
*/
}
}
回答1:
Your code looks good, i think is more likely the way this apps handle notifications, what you can do is to create a flag if the app tries to create multiple notifications at the same time:
public void timeCheck(){
if(timeCheck = true){
timeCheck = false;
new CountDownTimer(2000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
timeCheck = true;
notificationSamePackage = "";
}
}.start();
}
}
......
......
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
if (notificationFromSamePackage != sbn.getPackageName() && timeCheck){
Log.d(TAG, "Notification has arrived");
Log.d(TAG, "ID: " + sbn.getId() + " Posted by: " + sbn.getPackageName() + " at: " + sbn.getPostTime() + " ");
logger.i(sbn.getId() + "," + sbn.getPackageName() + "," + sbn.getPostTime(), mContext);
logger.close();
notificationSamePackage = sbn.getPackageName();
timeCheck();
}
}
Wrote it on the go, code might need to be checked
Hope it helps.
回答2:
This happens because WhatsApp and Gmail send a group summary notification alongside other notifications.
The related flag is documented here: https://developer.android.com/reference/android/app/Notification.html#FLAG_GROUP_SUMMARY
You can ignore notifications with this flag like this:
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
if ((sbn.getNotification().flags & Notification.FLAG_GROUP_SUMMARY) != 0) {
//Ignore the notification
return;
}
//...
}
回答3:
You can filter old notification by compare the received Notification.when with the last Notification.when.
private final Map<String, Long> pkgLastNotificationWhen = new HashMap<>();
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
if ((sbn.getNotification().flags & Notification.FLAG_GROUP_SUMMARY) != 0) {
Log.d(TAG, "Ignore the notification FLAG_GROUP_SUMMARY");
return;
}
Long lastWhen = pkgLastNotificationWhen.get(sbn.getPackageName());
if(lastWhen != null && lastWhen >= sbn.getNotification().when){
Log.d(TAG, "Ignore Old notification");
return;
}
pkgLastNotificationWhen.put(sbn.getPackageName(), sbn.getNotification().when);
//do something...
}
来源:https://stackoverflow.com/questions/45890487/android-onnotificationposted-is-called-twice-for-gmail-and-whatsapp