IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 统计直播间的榜一信息,从这里起步 -> 正文阅读

[移动开发]统计直播间的榜一信息,从这里起步

背景

全民短视频,mcn机构的遍地开花,mcn的的生存、发展就要想各种各样的办法。在一个数据导向的社会,大家都希望通过数据获取更多、更准确的数据,于是有朋友希望统计下进入抖音直播间的人数和人物的基础信息。 想到之前写的一个自动翻页的小工具,想来这个事情还不是手拿把掐的小事嘛?于是就一口答应了。 于是就遇到了一系列的问题。

正常的流程

1、通过工具定位具体的view

2、根据业务,对view进行操作

遇到的问题

怎么查找希望的view? 赶时间的同学可以直接看最后的捷径整理

常用工具

2.1.1、ddms中的 dump view hierarchy for ui automator 新版本Android studio中已经不提供 可以尝试在Android sdk路径下,查看tools/monitor 是否存在,存在即还有可能能用。

2.1.2、上面提供的工具如果可用,还有一个简化版本的,可以直接在tools/bin下查找 uiautomatorviewer 功能和上面的一样

正常是这样的效果

还有就是利用adb命令,adb命令的方法看起来比较头疼,就不举例了,具体的可以自己搜索下。

出师不利

上面的工具已经用的比较多了,就以为解决这个问题就是分分钟的事情。还是自己年轻了。 尝试了2.1.1方法,然后一直失败

最开始以为是工具不对,内存导致的 就换了2.1.2的工具。还是不行。但是发现了一个重要的现象 如果页面上面的变化内容比较少的话,就能抓取到,多了就不行了 ,结合保存怀疑是因为在生成view hierarchy的时候,直播页面已经发生了变化,导致生成失败。

要不尝试反编译下apk?

说干就干,使用jadx对apk进行反编译,8g内存直接被爆了,重新配置为16g,正常跑起来了。 看了下代码,觉得头疼,要不还是想下其他方案吧。不得不说,直播页真的是有点头疼 1、activity竟然还要使用代理来处理 2、使用了万恶的event bus 3、对资源进行了混淆和代理 整体来说,如果去看这个代码的话,就比较头疼,要花比较多的精力。

要不先xp hook下?

这个好像成本也比较大。作为兜底方案。

柳暗花明又一村

本来以为没有其他的更好方案了,后来一想,不对,我们既然已经使用了辅助功能,为啥不考虑用api来做呢? 说干就干。 1、我们的service直接继承自 AccessibilityService 我们之前的业务也都在这个里面处理。

????public?abstract?void?onAccessibilityEvent(AccessibilityEvent?event);

关注到 AccessibilityEvent 下有

????public?@EventType?int?getEventType()?{
????????return?mEventType;
????}

查看EventType:

????@IntDef(flag?=?true,?prefix?=?{?"TYPE_"?},?value?=?{
????????????TYPE_VIEW_CLICKED,
????????????TYPE_VIEW_LONG_CLICKED,
????????????TYPE_VIEW_SELECTED,
????????????TYPE_VIEW_FOCUSED,
????????????TYPE_VIEW_TEXT_CHANGED,
????????????TYPE_WINDOW_STATE_CHANGED,
????????????TYPE_NOTIFICATION_STATE_CHANGED,
????????????TYPE_VIEW_HOVER_ENTER,
????????????TYPE_VIEW_HOVER_EXIT,
????????????TYPE_TOUCH_EXPLORATION_GESTURE_START,
????????????TYPE_TOUCH_EXPLORATION_GESTURE_END,
????????????TYPE_WINDOW_CONTENT_CHANGED,
????????????TYPE_VIEW_SCROLLED,
????????????TYPE_VIEW_TEXT_SELECTION_CHANGED,
????????????TYPE_ANNOUNCEMENT,
????????????TYPE_VIEW_ACCESSIBILITY_FOCUSED,
????????????TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED,
????????????TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY,
????????????TYPE_GESTURE_DETECTION_START,
????????????TYPE_GESTURE_DETECTION_END,
????????????TYPE_TOUCH_INTERACTION_START,
????????????TYPE_TOUCH_INTERACTION_END,
????????????TYPE_WINDOWS_CHANGED,
????????????TYPE_VIEW_CONTEXT_CLICKED,
????????????TYPE_ASSIST_READING_CONTEXT
????})
????@Retention(RetentionPolicy.SOURCE)
????public?@interface?EventType?{}

看到了心心念念的 TYPE_VIEW_CLICKED 我觉得看到了光明。

2、就干,代码安排上。 开启辅助,触发对应view的点击事件。激动人心的事情发生了

真的输出了对应的view id和text!!!

3、使用

findAccessibilityNodeInfosByViewId(String?viewId)

获取对应的nodeInfo,然后对其进行点击操作。

原本平淡无奇的操作,竟然再起波澜。

波澜再起

发现对前面找到的view进行点击操作的时候,无法触发效果。 但是我刚才点击的时候抓到的明明是这个view啊,text内容也是对的,怎么回事呢? 先看下这个view是不是clickable吧,万一没有这个功能呢?

List<AccessibilityAction>?getActionList()

nodeInfo提供了查看当前节点所有的action的列表,也有对应的含义。其中我们比较关注的是这个

????public?static?final?int?ACTION_CLICK?=?0x00000010;

遗憾的是前面找到的view并没有这个action。

完美结局

回想Android的事件传递机制,如果一个view没有拦截点击事件,但是点击事件还被响应了,那就只有一个情况--当前的view的父布局或者子布局把事件给处理了。 兵分两路 通过:

getParent()
getChild(i)

去查看对应的父view和子view,并检查他们对应的action是否有click。 功夫不负有心人。最终确认了,view的父布局中有click的action。对父view进行操作,也获得了期望的效果。至此这个问题被解决。

捷径整理

1、利用AccessibilityService中onAccessibilityEvent的event 的clicktype,缩小view的查找范围。

2、校验view是否是想要确认的view

3、如果是需要view,但是无法响应事件,可以查找他的父布局或者子布局上能够响应click的view

4、确定最终要确定的view

5、不要被之前的经验所束缚,要多使用系统给的api,要多思考系统原理。

关注公众号: arigeweixin ,取得更多联系

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:34:46  更:2022-07-17 16:37:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:51:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码