2015-03-31 2 views
7

Вопрос в том, как получить поле TEXT (не заголовок) всех входящих уведомлений, когда они укладываются (например, в Whatsapp).Как получить текст Stacked Notifications в Android

enter image description here

public class NLService extends NotificationListenerService { 
public void onNotificationPosted(StatusBarNotification sbn) { 

    Log.v(Constants.TAG_notifs, 
      "------------------------- in onNotificationPosted(), Notification Text = " 
        + sbn.getNotification().tickerText); 


    Bundle extras = sbn.getNotification().extras; 

    if (extras.containsKey("android.text")) { 
     if (extras.getCharSequence("android.text") != null) { 
      String text = extras.getCharSequence("android.text").toString(); 
      Log.v(Constants.TAG_notifs, 
        "------------------------- in onNotificationPosted(), Bundle.text != NULL, so here it is = " 
          + text); 
     } 
    } 

    if (extras.containsKey("android.title")) { 
     Log.v(Constants.TAG_notifs, 
       "------------------------- in onNotificationPosted(), Bundle android.title = " 
         + extras.getString("android.title")); 
    } 

} 

@Override 
public void onNotificationRemoved(StatusBarNotification sbn) { 
    //super.onNotificationRemoved(sbn); 
} 

} В первый раз, когда уведомление Whatsapp поступает от одного пользователя этой линии (Строка текста = extras.getCharSequence ("android.text") ToString();.) успешно умеет читать текст, но после этого, когда приходит больше сообщений, и уведомления укладываются (например, на рисунке, показанном выше), переменная текст всегда имеет значение NULL.

Это должно быть возможно, потому что this app делает это, проверял его. Он получает текст каждого приложения.

Added Incentive: Если вы знаете ответ или что-то попробовать, возникает другой вопрос, который выглядит аналогичным вопросом here.

ответ

14

WhatsApp приложение имеет структуру для отправки уведомлений, как это:

 Case         Notification 

Message comes from A : Hi     Title : A Text: Hi 

Message comes from A : How are you   Title : A Text: How are you 

              Title : A Text: 2 new messages 


Message comes from B : Hello    Title : B Text: Hello 

              Title : B Text: 1 new message 

              Title : A Text: 2 new messages 

        Title : WhatsApp Text: 3 new messages from 2 conversation 
---- Here comes the stacking ---- 

Message comes from C : Good work   Title : C Text: Good work 

              Title : C Text: 1 new message 

              Title : B Text: 1 new message 

              Title : A Text: 2 new messages 

        Title : WhatsApp Text: 4 new messages from 3 conversation 


---- This way when new sender message comes, previoud notifications also comes and we get callback in NotificationListener ---- 

Последнее уведомление приходит с названием, как Имя пакета: WhatsApp и текста как: X сообщений от Y Диалог

Чтобы получить текст:

sbn.getNotification().extras.getCharSequence(Notification.EXTRA_TEXT).toString(); 

Чтобы получить Название:

sbn.getNotification().extras.getCharSequence(Notification.EXTRA_TITLE).toString(); 

Для работы с этим sturcture укладки, мы должны разобрать этот стек уведомления и отображать только выборочную информацию в нашем приложении

Я надеюсь, что мой ответ поможет и решить ваш запрос

+0

Когда второе уведомление (скажем, от А в вашем примере) появляется в 'sbn.getNotification().getCharSequence (Notification.EXTRA_TEXT) .ToString();» NULL, там ничего нет. Вы тоже не видите NULL? Я пытаюсь в Kitkat, API = 19 – user1406716

+0

Я не уверен, что это правда, не могли бы вы рассказать о том, как получить предыдущие уведомления? ?: * * Таким образом, когда приходит новое сообщение отправителя, также появляются уведомления о предыдущих действиях, и мы получаем callback in NotificationListener * « – user1406716

+0

Для KitKat он должен хорошо работать с AccessibilityService. Попробуйте использовать этот обратный вызов службы. В моем случае AccessibilityService работал нормально до (<= KitKat), поэтому PLS проверяет его использование – Kushal

0

только проработанный на WhatsApp с Разрешение на доступность. все входящие уведомления, когда они укладываются (например, в Whatsapp), вы можете использовать метод AccessibilityEvent getRecord() для извлечения контекста в стеке. Содержимое содержит [отправитель, чтобы, время, контекст, индекс] проверено на Android 5.1 на MOTO G

1

Я думаю, что это может помочь вам:

CharSequence[] lines = 
extras.getCharSequenceArray(Notification.EXTRA_TEXT_LINES); 
if(lines != null && lines.length > 0) { 
    StringBuilder sb = new StringBuilder(); 
    for (CharSequence msg : lines) 
     if (!TextUtils.isEmpty(msg)) { 
     sb.append(msg.toString()); 
     sb.append('\n'); 
     } 
    return sb.toString().trim(); 
} 
CharSequence chars = 
extras.getCharSequence(Notification.EXTRA_BIG_TEXT); 
if(!TextUtils.isEmpty(chars)) 
    return chars.toString(); 
0

Если вы работаете с Android 7.0+, WhatsApp использует расширенные уведомления MessageStyle. Здесь - https://developer.android.com/training/notify-user/expanded.html#message-style

Чтобы получить все 5 сообщений из уведомления как

MyFriend (5 messages) 
testt 

ли это:

Bundle extras = mysbn.getNotification().extras; 
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)){ 
     Parcelable b[] = (Parcelable[]) extras.get(Notification.EXTRA_MESSAGES); 

     if(b != null){ 
      content = ""; 
      for (Parcelable tmp : b){ 

       Bundle msgBundle = (Bundle) tmp; 
       content = content + msgBundle.getString("text") + "\n"; 

       /*Set<String> io = msgBundle.keySet(); // To get the keys available for this bundle*/ 

      } 
     } 
    } 

То же, что мой ответ here.

Смежные вопросы