gpt4 book ai didi

android - 从 parcelable、contentView 或 contentIntent 中提取通知文本

转载 作者:IT王子 更新时间:2023-10-29 00:02:59 24 4
gpt4 key购买 nike

所以我让我的 AccessibilityService 使用以下代码:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
List<CharSequence> notificationList = event.getText();
for (int i = 0; i < notificationList.size(); i++) {
Toast.makeText(this.getApplicationContext(), notificationList.get(i), 1).show();
}
}
}

它可以很好地读出创建通知时显示的文本(1)

enter image description here

唯一的问题是,我还需要用户打开通知栏时显示的 (3) 的值。 (2) 对我来说并不重要,但如果知道如何读出来就好了。您可能知道,所有值都可以不同。

enter image description here

那么,我该如何读出(3)?我怀疑这是不可能的,但我的 notificationList似乎只有一个条目(至少只显示了一个 toast)。

非常感谢!

/edit:我可以用

提取通知包
if (!(parcel instanceof Notification)) {
return;
}
final Notification notification = (Notification) parcel;

但是,我不知道如何从 notification 中提取通知消息。或 notification.contentView/notification.contentIntent .

有什么想法吗?

/edit:澄清这里的问题:我怎样才能读出(3)

最佳答案

在过去的几天里,我浪费了几个小时来寻找一种方法来做你(顺便说一下,我也是)想做的事情。在查看了 RemoteViews 的整个源代码两次之后,我发现完成这项任务的唯一方法是古老、丑陋和 hacky 的 Java 反射。

这里是:

    Notification notification = (Notification) event.getParcelableData();
RemoteViews views = notification.contentView;
Class secretClass = views.getClass();

try {
Map<Integer, String> text = new HashMap<Integer, String>();

Field outerFields[] = secretClass.getDeclaredFields();
for (int i = 0; i < outerFields.length; i++) {
if (!outerFields[i].getName().equals("mActions")) continue;

outerFields[i].setAccessible(true);

ArrayList<Object> actions = (ArrayList<Object>) outerFields[i]
.get(views);
for (Object action : actions) {
Field innerFields[] = action.getClass().getDeclaredFields();

Object value = null;
Integer type = null;
Integer viewId = null;
for (Field field : innerFields) {
field.setAccessible(true);
if (field.getName().equals("value")) {
value = field.get(action);
} else if (field.getName().equals("type")) {
type = field.getInt(action);
} else if (field.getName().equals("viewId")) {
viewId = field.getInt(action);
}
}

if (type == 9 || type == 10) {
text.put(viewId, value.toString());
}
}

System.out.println("title is: " + text.get(16908310));
System.out.println("info is: " + text.get(16909082));
System.out.println("text is: " + text.get(16908358));
}
} catch (Exception e) {
e.printStackTrace();
}

此代码在装有 Android 4.0.3 的 Nexus S 上运行良好。但是,我没有测试它是否适用于其他版本的 Android。很可能某些值,尤其是 viewId 发生了变化。我认为应该有办法支持所有版本的 Android,而无需对所有可能的 id 进行硬编码,但这是另一个问题的答案...... ;)

PS:您要查找的值(在原始问题中称为“(3)”)是“文本”值。

关于android - 从 parcelable、contentView 或 contentIntent 中提取通知文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9292032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com