我正在寻找一种方法,当有多行时,从WhatsApp通知中获取消息。
我试图通过Android中的Reflection从内部类中的私有变量中获取值。我试图获取用于构建InboxStyle通知的'mTexts'charsequence的ArrayList。自从上次更新以来,我一直在寻找来自whatsapp的消息。在notificationListener()监听的通知上没有EXTRA,它有多行通知(我只能得到第一行)。
任何获取线条的方法都是值得的。
这是我的代码。
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
super.onNotificationPosted(sbn);
Class[] declaredClasses = sbn.getNotification().getClass().getClasses();
for (Class c : declaredClasses){
if(c.getName().contains("Notification$InboxStyle")){
Class inboxStyleClass = c.getClass();
Field[] fields = inboxStyleClass.getDeclaredFields();
for(Field field : fields){
if(field.getName().contains("mText")){
Field fmText = null;
try {
fmText = inboxStyleClass.getDeclaredField("mTexts");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
ArrayList<CharSequence> mTextsArrayList = null;
fmText.setAccessible(true);
try{
mTextsArrayList = (ArrayList<CharSequence>) fmText.get(**WICH OBJECT MAY USE HERE**);
}catch(IllegalAccessException e){
e.printStackTrace();
}
for(CharSequence value : mTextsArrayList){
Log.i("XXX","Results are: "+value.toString());
}
}
}
}
}
}
我正确到达 mText 字段但我无法从中获取值。
我尝试使用新的 Notification.InboxStyle()对象
Notification.InboxStyle iStyleObjectToGetTheValue = new Notification.InboxStyle();
看它是否运作良好,而且确实
inboxStyle = (ArrayList<CharSequence>) fmText.get(iStyleObjectToGetTheValue);
但我需要通知中的值。关于如何实现这一目标的任何想法?
我还尝试通过 StatusBarNotification.getNotification()。THE_REMOTE_VIEW 来获取可以检索 RemoteViews 的消息行,因为使用 DeviceMonitor 你可以对设备进行大屏幕截图并查看视图的ID ......但是没有幸运。
任何获取线条的方法都是值得的。
欢迎所有帮助!! 谢谢!
答案 0 :(得分:0)
根据RemoteView.apply()的文档:
查看apply(上下文上下文,ViewGroup父级) - 膨胀此对象表示的视图层次结构并应用所有操作。
您可以创建父级并为RemoteView.apply()
提供上下文。检查生成的视图以查找文本:
@Nullable
public View getBigContentView (StatusBarNotification statusBarNotification) {
RemoteViews bigContentView = statusBarNotification.getNotification().bigContentView;
return bigContentView != null ? bigContentView.apply(ctx, null) : null;
}
根据文档的说法,这可能不适用于Nougat手机(仔细阅读此内容告诉我,Google可能并不意味着您阅读此参数,并且只应在构建通知时使用它):
* As of N, this field may be null. The expanded notification view is determined by the * inputs to {@link Notification.Builder}; a custom RemoteViews can optionally be * supplied with {@link Notification.Builder#setCustomBigContentView(RemoteViews)}.