4

I'm trying to read notifications using Android 4.3's Notification Listener API. I've followed multiple tutorials E.g. http://gmariotti.blogspot.hk/2013/11/notificationlistenerservice-and-kitkat.html?view=magazine

Also this question doesn't solve my problem since I'm not looking to read Big View notifications. I can do that

Getting Detail/Expanded Text from an Android Notification?

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 output from the screenshot:

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 those Notifications either as an Object String or whatever. All I need is the Text, Title and Source Application from each of those notifications.

As you can see, the Object I'm currently receiving only returns Null when I'm trying to get the Text from the notification

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

Community
  • 1
  • 1
user3549377
  • 41
  • 2
  • 4

2 Answers2

0

Because the notification use the customs view now,so we need use some trick.

You can search "remote view gettext" also...

Retrieve text from a RemoteViews Object

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's 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's 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;
}
Community
  • 1
  • 1
朱西西
  • 1,005
  • 8
  • 7
0

In my environment, the code below works for me.

How I solved

sbn.getNotification().extras.getCharSequence("android.title")

sbn.getNotification().extras.get("android.title")

minnya
  • 1