Как да получите текст на подредени известия в Android

Въпросът е как да получите полето ТЕКСТ (не заглавие) на всички входящи известия, когато бъдат подредени (като в Whatsapp).

въведете описание на изображението тук

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 пристигне от един потребител, този ред (String text = extras.getCharSequence("android.text").toString();) може успешно да прочете текст, но след това, когато постъпят повече съобщения и известията се натрупват (както на снимката, показана по-горе), променливата текст винаги е NULL.

Това трябва да е възможно, защото това приложение прави го, тества го. Той получава текста на всяко приложение.

Допълнителен стимул: Ако знаете отговора или неща, които да опитате, има друг въпрос, който изглежда подобен на въпрос тук.


person user1406716    schedule 31.03.2015    source източник


Отговори (4)


Приложението 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();

За да работим с тази структура на подреждане, трябва да анализираме този стек от известия и да покажем само селективна информация в нашето приложение

Надявам се, че отговорът ми ще помогне и ще разреши вашето запитване

person Kushal    schedule 31.03.2015
comment
Когато второто известие (да кажем от A във вашия пример) дойде в 'sbn.getNotification().extras.getCharSequence(Notification.EXTRA_TEXT).toString();' е NULL, там няма нищо. Не го ли виждате и NULL? Опитвам се в Kitkat, API=19 - person user1406716; 31.03.2015
comment
Не съм сигурен дали това е вярно, бихте ли разяснили как да получа и предишните известия?: По този начин, когато дойде съобщение от нов подател, идват и предишни известия и получаваме обратно извикване в NotificationListener - person user1406716; 31.03.2015
comment
За KitKat трябва да работи добре с AccessibilityService.. Опитайте да използвате тази услуга за обратно извикване.. В моя случай AccessibilityService работеше добре до (‹= KitKat), така че, моля, проверете дали го използвате - person Kushal; 31.03.2015
comment
За получаване на предишни известия можете да поддържате структурата на данните, да запазвате входящите известия в нея, да анализирате и показвате селективно известие към вашето приложение от нея - person Kushal; 31.03.2015
comment
Значи сте опитали само с AccessibilityService, а не с NotificationListenerService??? При използване на NotificationListenerService се чете само ТЕКСТЪТ на първото известие, след което всички полета TEXT са NULL, така че не мога да ги запазя и в собствената си структура от данни. Методът AccessibilityService няма ли да работи в Lollipop?? - person user1406716; 31.03.2015
comment
Не, достъпността не работи с пакета WhatsApp.. дава null там.. - person Kushal; 31.03.2015
comment
Така че правилно ли разбирам, че тогава не е възможно да получите ТЕКСТ на всяко едно известие от Whatsapp? - person user1406716; 31.03.2015
comment
Използвайте услугата за достъпност за ‹= KitKat и използвайте услугата NotificationListener за › Kitkat.. Тогава ще можете да получите текст - person Kushal; 31.03.2015

Ако работите с Android 7.0+, WhatsApp използва MessageStyle Expanded Notifications. Тук - 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*/

            }
        }
    }

Същото като моя отговор тук.

person Balamurugan    schedule 08.03.2018

Мисля, че това може да ви помогне:

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();
person Ismael Duzi    schedule 09.02.2017

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

person Fan Li    schedule 05.12.2016