如何从堆栈的通知android获取文本

时间:2018-03-22 05:38:00

标签: android android-notifications whatsapp notification-listener

请帮助我,我试图从一堆通知中获取文本。我收到了以下错误。

java.lang.NoSuchFieldException: No field mActions in class 
Landroid/app/Notification$BuilderRemoteViews; (declaration of 
'android.app.Notification$BuilderRemoteViews' appears in 
 /system/framework/framework.jar)

我正在使用NotificationListenerService和

    private List<String> getMessages(Notification notification) {
        RemoteViews views = notification.bigContentView;
        if (views == null) views = notification.contentView;
        if (views == null) return null;
        List<String> text = new ArrayList<String>();


        try {


            Field field = views.getClass().getDeclaredField(Constants.ACTIONS);
            field.setAccessible(true);

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

            for (Parcelable p : actions) {
                Parcel parcel = Parcel.obtain();
                p.writeToParcel(parcel, 0);
                parcel.setDataPosition(0);
                int tag = parcel.readInt();
                if (tag != 2) continue;
                parcel.readInt();

                String methodName = parcel.readString();
                if (methodName == null) {
                    continue;
                } else if (methodName.equals(Constants.SET_TEXT)) {
                    parcel.readInt();

                    methodName.getBytes();
                    String gettingText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel).toString().trim();
                    text.add(gettingText);
                } else if (methodName.equals(Constants.SET_TIME)) {
                    parcel.readInt();
                    String gettingText = new SimpleDateFormat("h:mm a").format(new Date(parcel.readLong()));
                    text.add(gettingText);
                }

                parcel.recycle();
            }
        } catch (Exception e) {
            Log.e("NotificationClassifier", e.toString());
        }

        return text;
    }

这在android 4,5中工作正常,但它在Android 7上崩溃,得到像mAction字段一样的错误。

请任何人帮我解决这个问题,我被困了两天。 谢谢

1 个答案:

答案 0 :(得分:0)

您正在使用反射来访问方法名称,而您没有为多个平台切换代码。您尝试访问的字段/方法会随着时间的推移而在多个版本的操作系统上发生变化,因此如果您真的想要进行反思,则必须研究它们的变化。

通常,反射应该是最后的手段,因为在Android上,基本代码因版本而异,甚至从制造商到制造商。