AccessibilityService无障碍

##跳过开屏广告的小软件,遇到一个问题,我只希望在软件启动有广告界面的时候跳过广告,但是跳过广告后,软件界面出现跳过和关闭两个匹配字符的时候,又被点击了。

##我试图匹配广告二字来判断是否需要点击跳过,但是有很多开屏界面没有广告二字……

##代码要什么写才能避免这个问题!

收起​

援引讯飞星火:
为了解决这个问题,你可以使用正则表达式来匹配广告相关的字符串,而不是仅仅匹配"广告"这两个字。这样可以避免在没有广告的情况下误点击跳过按钮。

首先,你需要确定一个合适的正则表达式来匹配广告相关的字符串。例如,你可以匹配包含"开屏广告"、"跳过广告"等关键词的字符串。然后,在处理点击事件时,使用这个正则表达式来判断是否需要点击跳过按钮。

以下是一个使用正则表达式匹配广告相关字符串的示例代码:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class AccessibilityServiceDemo {
    public static void main(String[] args) {
        // 假设这是从界面上获取的广告字符串
        String adText = "跳过开屏广告";

        // 定义一个正则表达式来匹配广告相关字符串
        String regex = "开屏广告|跳过广告";

        // 创建Pattern对象
        Pattern pattern = Pattern.compile(regex);

        // 创建Matcher对象
        Matcher matcher = pattern.matcher(adText);

        // 判断是否匹配到广告相关字符串
        if (matcher.find()) {
            // 在这里处理点击跳过按钮的逻辑
            System.out.println("需要点击跳过按钮");
        } else {
            // 在这里处理不需要点击跳过按钮的逻辑
            System.out.println("不需要点击跳过按钮");
        }
    }
}

你可以根据实际情况修改正则表达式以及其他逻辑,以满足你的需求。

引用 皆我百晓生 小程序回复内容作答:

要解决这个问题,可以尝试以下方法:

  1. 检查界面元素的内容描述或文本内容:可以通过获取界面元素的内容描述或文本内容来判断是否为广告界面。可以使用AccessibilityNodeInfogetContentDescription()getText()方法获取元素的内容描述或文本内容,并对其进行判断。

  2. 检查界面元素的类型:广告界面通常包含图片、WebView或特殊的广告控件等。可以使用AccessibilityNodeInfogetClassName()方法获取元素的类型,并对其进行判断。

  3. 检查界面元素的位置:广告界面通常会有特定的位置,例如在屏幕的顶部或底部。可以使用AccessibilityNodeInfogetBoundsInScreen()方法获取元素在屏幕中的位置,并对其进行判断。

  4. 使用模糊匹配:如果无法准确匹配广告界面的特征,可以尝试使用模糊匹配的方法。例如,可以匹配包含"广告"、"推广"、"赞助"等关键字的内容描述或文本内容。

以下是一个示例代码,用于在AccessibilityService中实现跳过广告的功能:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
        if (rootNode == null) {
            return;
        }

        if (isAdPage(rootNode)) {
            skipAd(rootNode);
        }
    }
}

private boolean isAdPage(AccessibilityNodeInfo rootNode) {
    // 判断是否为广告界面的逻辑
    // 可以根据元素的内容描述、文本内容、类型或位置等进行判断
    // 返回true表示是广告界面,返回false表示不是广告界面
}

private void skipAd(AccessibilityNodeInfo rootNode) {
    // 执行跳过广告的操作
    // 可以根据具体的界面元素信息进行点击操作
}

isAdPage()方法中,你可以根据实际情况来判断是否为广告界面。可以使用rootNode.findAccessibilityNodeInfosBy...()方法来获取具体的界面元素,并通过判断元素的内容描述、文本内容、类型或位置等来确定是否为广告界面。

skipAd()方法中,你可以使用rootNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)方法来执行点击操作,跳过广告。

注意,以上代码只是一个示例,具体实现可能需要根据你的应用的具体情况进行调整和修改。

结合GPT给出回答如下请题主参考
您无需匹配广告二字,而是可以直接匹配跳过或关闭两个字符,只有当二者同时出现时才点击跳过或关闭。您可以添加一个判断条件,仅当广告界面出现并且跳过或关闭字符同时出现时才执行点击操作。以下是示例代码:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    // 判断界面是否为广告界面
    if (event.getClassName().equals("com.example.advertisement.AdvertisementActivity")) {
        // 查找跳过或关闭字符并点击
        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
        if (rootNode != null) {
            List<AccessibilityNodeInfo> nodes = rootNode.findAccessibilityNodeInfosByText("跳过");
            nodes.addAll(rootNode.findAccessibilityNodeInfosByText("关闭"));
            for (AccessibilityNodeInfo node : nodes) {
                if (node.isClickable()) {
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    break;
                }
            }
        }
    }
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    // 判断界面是否为广告界面
    if (event.getClassName().equals("com.example.advertisement.AdvertisementActivity")) {
        // 查找跳过或关闭字符并点击
        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
        if (rootNode != null) {
            List<AccessibilityNodeInfo> nodes = rootNode.findAccessibilityNodeInfosByText("跳过");
            nodes.addAll(rootNode.findAccessibilityNodeInfosByText("关闭"));
            for (AccessibilityNodeInfo node : nodes) {
                if (node.isClickable()) {
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    break;
                }
            }
        }
    }
}