AccessibilityService无障碍遇到的问题

练习做一个跳过广告的软件,我用weditor定位到关闭按钮,但是用performAction(AccessibilityNodeInfo.ACTION_CLICK)点击无效。

textNodeInfoList.get(0).isClickable()
//返回false
List<AccessibilityNodeInfo> textNodeInfoList = sourceNodeInfo.findAccessibilityNodeInfosByText("关闭");
//这里能获取关闭节点。

定位元素截图两张,各位帮我看看,具体该怎么做!

img

img

你可以试试其他方法,java的这个


Rect bounds = new Rect();
textNodeInfoList.get(0).getBoundsInScreen(bounds);
int x = bounds.centerX();
int y = bounds.centerY();
GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
Path path = new Path();
path.moveTo(x, y);
gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 0, 100));
GestureDescription gestureDescription = gestureBuilder.build();
dispatchGesture(gestureDescription, new GestureResultCallback() {
    @Override
    public void onCompleted(GestureDescription gestureDescription) {
        super.onCompleted(gestureDescription);
        // 点击完成后的操作
    }
});

【以下回答由 GPT 生成】

问题解决方法:

根据问题描述和截图,问题可能出在两个方面:一是没有正确获取到关闭按钮的节点信息,二是点击操作无效。

  1. 首先,我们需要确保正确获取到关闭按钮的节点信息。可以尝试使用getResourceName()方法获取节点的资源名称,然后通过日志输出来确认。可以使用以下代码:
List<AccessibilityNodeInfo> textNodeInfoList = sourceNodeInfo.findAccessibilityNodeInfosByText("关闭");
for (AccessibilityNodeInfo node : textNodeInfoList) {
    String resourceName = node.getViewIdResourceName();
    Log.d("AccessibilityService", "Resource Name: " + resourceName);
}

确保日志输出的资源名称与关闭按钮的资源名称匹配。如果输出的资源名称为空,可能是因为关闭按钮的节点不可见,此时需要调用getParent()方法来获取其父节点,然后再对父节点进行搜索。

  1. 如果关闭按钮的节点信息正确获取到,并且点击操作仍然无效,可能是因为应用程序的窗口层级问题。在通过无障碍服务进行点击操作时,需要确保应用程序的窗口处于可点击状态。

可以尝试通过以下代码将窗口设为可点击,并再次进行点击操作:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

将以上代码放置在点击操作之前,重新运行程序,看是否能够成功进行点击操作。

如果以上方法都没有解决问题,可能是由于应用程序的安全设置或其他原因导致无法进行点击操作。此时建议尝试其他方式来跳过广告,比如模拟屏幕触摸事件或者使用系统级别的广告屏蔽软件。

希望以上解决方案能够帮助到你解决问题。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

首先,检查下权限问题:确保你的应用有适当的权限。在AndroidManifest.xml文件中,你需要添加以下权限:
<uses-permission android:name="android.permission.ACCESSIBILITY_SERVICE" />
其次,使用performAction(AccessibilityNodeInfo.ACTION_CLICK)点击一个元素时,该元素必须是你的应用正确的定位到了关闭按钮
然后,使用performClick()方法。这个方法会模拟一个物理点击事件。示例:node.performClick();