Android - 堆叠时获取通知(通知监听器)

时间:2014-06-14 19:07:29

标签: android notifications listener

我正在尝试使用Android 4.3的Notification Listener API阅读通知。 我遵循了多个教程 例如。 http://gmariotti.blogspot.hk/2013/11/notificationlistenerservice-and-kitkat.html?view=magazine

此问题也无法解决我的问题,因为我不打算阅读Big View通知。我可以那样做

Getting Detail/Expanded Text from an Android Notification?

这是我的代码:

    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, "--------------------------------------------------------------------------------------------");

这是屏幕截图中的ADB输出:

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

我要做的是将每个通知作为对象字符串或其他任何内容。我需要的只是每个通知中的文本,标题和源应用程序。

正如您所看到的,当我尝试从通知中获取文本时,我当前收到的对象仅返回Null

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

1 个答案:

答案 0 :(得分:0)

因为通知现在使用海关视图,所以我们需要使用一些技巧。

您可以搜索"远程查看gettext"也...

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;
}