Jason

I'm not only a programmer, but a gentleman

  • 主页
  • 防撤回

Jason

I'm not only a programmer, but a gentleman

  • 主页
  • 防撤回

高效的记录QQ屏幕消息

2019-09-12

如果你刚开始接触 Accessibility Service, 肯定知道 findAccessibilityNodeInfosByViewId() 这个函数,
他能方便的根据 View 的 id 找到这个 node.

但它其实非常的费时, 在我的测试下, 如果用它获取QQ的文字消息, 找一次就得 50-150毫秒.
而在屏幕滚动时, 会产生非常多的 event, 用户体验极差.

从适配早期微信的不固定ID所启发, 我可以根据 node tree 从顶上找下来. 微信你ID会变, UI总不怎么变吧?

我把这一套东西搬到QQ, 根据测试好的位置直接找, 只需要 5-10毫秒就获取, 性能提升极大.

但这会花很多的开发和测试时间, 在不同的状态: 好友 群 单向好友 临时对话, 他们的UI布局会稍有不同. 但为了极致性能, 这点时间值得.

接下来要设置合理的过滤器, 过滤掉不需要的事件.

首先 在QQ的聊天界面, 它的子节点特别多, 在8-15个.

在有新消息或者滚动时, 只需要关注装消息的容器发出的事件, 也就是 AbsListView.equals(event.getClassName())

当非当前聊天对象发来消息时, 会显示在屏幕上, 这是一条 class 为 android.widget.TextView 的 event.
但这样的event太多了, 后来我发现, 会先产生一条 TYPE_WINDOW_STATE_CHANGED, 我先在那时判断是否有这个窗口就好

  • anti-recall
Anti-Recall 首月总结
© 2022 Jason 浙ICP备17036515号-2
Hexo Theme Yilia by Litten