如何从一堆通知中获取文本 安卓.



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

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

我正在使用通知侦听器服务,并且

    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 字段不可用。

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

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

一般来说,反射确实应该是最后的手段,因为在Android上,基本代码因版本而异,甚至因制造商而异。

最新更新