Android - Receive notifications when they are folded (notification listener)

I am trying to read notifications using the Android 4.3 Notification Listener API. I followed several tutorials for example. http://gmariotti.blogspot.hk/2013/11/notificationlistenerservice-and-kitkat.html?view=magazine

Also this question does not solve my problem as I do not want to read Big View notifications. I can do it

Getting verbose / extended text from Android notifications?

This is my code:

    Log.d(logtag,"CharSequence - Title: "+sbn.getNotification().extras.getCharSequence("android.title")+
            " CharSequence - textLines: "+sbn.getNotification().extras.getCharSequence("android.textLines")+
            " CharSequence - subText: "+sbn.getNotification().extras.getCharSequence("android.subText")+
            " CharSequence - text: "+sbn.getNotification().extras.getCharSequence("android.text")+
            " CharSequence - infoText: "+sbn.getNotification().extras.getCharSequence("android.infoText")+
            " CharSequence - summaryText: "+sbn.getNotification().extras.getCharSequence("android.summaryText"));

    Log.d(logtag,"String - Title: "+sbn.getNotification().extras.getString("android.title")+
            " String - textLines: "+sbn.getNotification().extras.getString("android.textLines")+
            " String - subText: "+sbn.getNotification().extras.getString("android.subText")+
            " String - text: "+sbn.getNotification().extras.getString("android.text")+
            " String - infoText: "+sbn.getNotification().extras.getString("android.infoText")+
            " String - summaryText: "+sbn.getNotification().extras.getString("android.summaryText"));


    Log.d(logtag, "--------------------------------------------------------------------------------------------");

    Notification mNotification=sbn.getNotification();
    if (mNotification!=null){
        Bundle extras = mNotification.extras;

        String notificationTitle =
                extras.getString(Notification.EXTRA_TITLE);
        Bitmap notificationLargeIcon =
                ((Bitmap) extras.getParcelable(Notification.EXTRA_LARGE_ICON));
        CharSequence notificationText =
                extras.getCharSequence(Notification.EXTRA_TEXT);
        CharSequence notificationSubText =
                extras.getCharSequence(Notification.EXTRA_SUB_TEXT);
        CharSequence notificationTextLines =
                extras.getCharSequence("android.textLines");
        Log.d(logtag, "New Title: "+notificationTitle);
        Log.d(logtag, "New Text: "+notificationText);
        Log.d(logtag, "New subText: "+notificationSubText);
        Log.d(logtag, "New textLines: "+notificationTextLines);

        Log.d(logtag, "--------------------------------------------------------------------------------------------");

And this is my ADB screen output:

D/AANN - NotificationListener﹕ CharSequence - Title: Alex CharSequence -    textLines: null CharSequence - subText: null CharSequence - text: null CharSequence - infoText: null CharSequence - summaryText: 8 new messages.
D/AANN - NotificationListener﹕ String - Title: Alex String - textLines: null String - subText: null String - text: null String - infoText: null String - summaryText: 8 new messages.

D/AANN - NotificationListener﹕ New Title: WhatsApp
D/AANN - NotificationListener﹕ New Text: null
D/AANN - NotificationListener﹕ New subText: null
D/AANN - NotificationListener﹕ New textLines: null

What I'm trying to do is get each of these notifications either as an object string or whatever. All I need is a text, header and source application from each of these notifications.

, , , Null,

http://i.stack.imgur.com/t09Ns.png

+4
1

, - .

" gettext"...

RemoteViews

public void onNotificationPosted(StatusBarNotification sbn) {
    Notification mNotification = sbn.getNotification();
    Log.v("mNotification.toString()", getText(mNotification).toString());

//

public static List<String> getText(Notification notification)
{
    // We have to extract the information from the view
    RemoteViews        views = notification.bigContentView;
    if (views == null) views = notification.contentView;
    if (views == null) return null;

    // Use reflection to examine the m_actions member of the given RemoteViews object.
    // It not pretty, but it works.
    List<String> text = new ArrayList<String>();
    try
    {
        Field field = views.getClass().getDeclaredField("mActions");
        field.setAccessible(true);

        @SuppressWarnings("unchecked")
        ArrayList<Parcelable> actions = (ArrayList<Parcelable>) field.get(views);

        // Find the setText() and setTime() reflection actions
        for (Parcelable p : actions)
        {
            Parcel parcel = Parcel.obtain();
            p.writeToParcel(parcel, 0);
            parcel.setDataPosition(0);

            // The tag tells which type of action it is (2 is ReflectionAction, from the source)
            int tag = parcel.readInt();
            if (tag != 2) continue;

            // View ID
            parcel.readInt();

            String methodName = parcel.readString();
            if (methodName == null) continue;

            // Save strings
            else if (methodName.equals("setText"))
            {
                // Parameter type (10 = Character Sequence)
                parcel.readInt();

                // Store the actual string
                String t = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel).toString().trim();
                text.add(t);
            }

            // Save times. Comment this section out if the notification time isn't important
            else if (methodName.equals("setTime"))
            {
                // Parameter type (5 = Long)
                parcel.readInt();

                String t = new SimpleDateFormat("h:mm a").format(new Date(parcel.readLong()));
                text.add(t);
            }

            parcel.recycle();
        }
    }

    // It not usually good style to do this, but then again, neither is the use of reflection...
    catch (Exception e)
    {
        Log.e("NotificationClassifier", e.toString());
    }

    return text;
}
0

Source: https://habr.com/ru/post/1544597/


All Articles