android无障碍自动化AccessibilityService

最近李跳跳很火,也尝试写这样的一款跳过开屏广告的软件,遇到的问题不少。

我是根据["跳过","关闭"]两个字符匹配跳过广告,还有一些规则关闭弹窗。

img

关键是跳过开屏广告进入到软件主界面,如果主界面有跳过或者关闭两个字符,它又去匹配,去点击,显然是一个很大的BUG。比如下面这个界面,跳过开屏广告后,主界面有跳过两个字,它又去匹配,点击了!

img

不知道李跳跳软件是如何处理这个问题的……

你好!看起来你正在尝试开发一款能够自动跳过安卓开屏广告的应用,不过遇到了一些问题。你提到你使用了"跳过"和"关闭"两个关键词进行匹配,以跳过广告并关闭弹窗。然而,主界面上如果同时出现了"跳过"或"关闭"这两个字符,你的应用会错判并点击了错误的位置,这被认为是一个很大的BUG。

要解决这个问题,有几种方法可以考虑:

  1. 更准确的匹配规则:优化你的匹配规则,使其更准确地匹配到广告和弹窗的关闭位置,防止出现误点击的情况。你可以尝试使用更特殊的标识符或字符串来进行匹配,确保只在广告或弹窗出现时执行相应的点击操作。

  2. 使用屏幕坐标定位:通过使用屏幕坐标来定位广告和弹窗的关闭位置,而不是单纯依赖关键词匹配。这样可以更精确地确定点击位置,避免因关键词重复出现而导致误点击的问题。

  3. 添加上下文判断:在点击之前,先判断当前界面的上下文是否与广告或弹窗匹配。例如,检查其他界面元素是否与目标元素相匹配,或者检查界面上的布局是否符合匹配条件。通过添加上下文判断,可以减少误点击的可能性。

  4. 测试和迭代:持续进行测试和调试,观察应用在不同场景下的表现,并根据实际情况进行迭代和改进。在开发过程中,通过多次实际测试和不断调整算法或规则,可以逐步优化应用的准确性和稳定性。

希望这些建议对你有所帮助!如果你有关于无障碍自动化或其他开发问题上的进一步疑问,请随时提问。

虽然没写过辅助软件,但感觉你可以试试加一些规则,比如匹配字符串的长度,按钮的位置等

【以下回答由 GPT 生成】

问题解决方案

在处理Android无障碍自动化AccessibilityService中遇到的跳过开屏广告问题时,可以尝试以下解决方案:

  1. 使用AccessibilityNodeInfo的父节点信息来限制匹配范围。当出现"跳过"或"关闭"字符时,通过获取该节点的父节点信息,判断父节点是否为主界面的元素。如果父节点不在主界面上,可以认为是开屏广告界面,放弃匹配和点击操作。
// 在AccessibilityService中的onAccessibilityEvent方法中,获取事件源的父节点信息
AccessibilityNodeInfo source = event.getSource();
AccessibilityNodeInfo parent = null;
if (source != null) {
    parent = source.getParent();
}

// 判断父节点是否为主界面上的元素
if (parent != null && isMainScreenElement(parent)) {
    // 进行匹配和点击操作
} else {
    // 放弃匹配和点击操作
}
  1. 根据开屏广告的特征进行判断。通过分析开屏广告的一些共同特征,例如界面布局、特定控件、组件ID等,可以识别出开屏广告界面,并避免匹配和点击操作。
// 在AccessibilityService中的onAccessibilityEvent方法中,通过特征判断是否为开屏广告界面
if (isSplashAdvertisement(source)) {
    // 放弃匹配和点击操作
} else {
    // 进行匹配和点击操作
}
  1. 使用延迟执行策略。在点击操作之前,可以通过延迟一定的时间来等待主界面完全加载完成,避免误点击开屏广告上的字符。可以通过Handler的postDelayed方法来实现延迟执行。
// 在AccessibilityService中使用Handler来延迟执行点击操作
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // 进行匹配和点击操作
    }
}, DELAY_TIME);

通过以上的解决方案,可以避免在主界面上误点击开屏广告上的字符。同时,建议根据具体应用场景和需求进行实际的优化和改进。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

针对跳过开屏广告的情况,可以在匹配跳过或关闭字符之前,先判断当前界面是否是开屏广告界面。可以通过界面元素的特征来判断,比如特定的控件ID、文本内容、控件位置等。只有在确认当前界面是开屏广告界面时,才进行跳过或关闭的匹配和点击操作。
可以设置一个延迟时间,在跳过开屏广告后等待一段时间,再进行匹配和点击操作。这样可以确保进入主界面后,界面元素已经加载完毕,避免误点击。

结合GPT给出回答如下请题主参考
如果你的问题是如何通过AccessibilityService实现跳过开屏广告进入到软件主界面,可以参考以下步骤:

  1. 在AccessibilityService的回调方法onAccessibilityEvent中监听窗口变化事件,获取当前窗口的包名和控件信息。
  2. 根据包名和控件信息判断当前窗口是否是开屏广告页面,可以根据界面元素的id、text、类名等属性进行匹配。
  3. 如果当前窗口是开屏广告页面,找到对应的跳过按钮或关闭按钮,模拟点击事件跳过广告,进入到软件主界面。
  4. 如果当前窗口不是开屏广告页面,继续监听下一个窗口。

你提到的关键词匹配方式也可作为判断条件之一,但不应该作为唯一的判断依据。另外,需要注意的是,使用AccessibilityService跳过广告等操作应该遵循合法合规的原则,不要违反相关法律法规和应用商店的规定。

检查当前界面是否是主界面,是否发生了变化,在选择是否跳过,继续跳过


https://developer.android.google.cn/guide/topics/ui/accessibility/service?hl=zh-cn

【杰哥带你玩转Android自动化】AccessibilityService基础 - 掘金 🤡 Hi,我是杰哥,本节过了一下 AccessibilityService无障碍服务 的基础姿势,并写了一个超简单的微信自动登录案例演示脚本编写的大概过程,相信读者学完可以动手尝试编写一些简单的脚本 https://juejin.cn/post/7169033859894345765



```c++
// 在AccessibilityService中的onAccessibilityEvent方法中,获取事件源的父节点信息
AccessibilityNodeInfo source = event.getSource();
AccessibilityNodeInfo parent = null;
if (source != null) {
    parent = source.getParent();
}
 
// 判断父节点是否为主界面上的元素
if (parent != null && isMainScreenElement(parent)) {
    // 进行匹配和点击操作
} else {
    // 放弃匹配和点击操作
}

```