Android辅助工具助手-keep 自动点赞器

本文介绍了一个基于Android的无障碍服务的应用,能够实现自动检测并点击指定应用内的点赞按钮。通过监听特定包名和类名的界面变化,应用可以识别出点赞元素并触发点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.运行界面

运行界面

源码下载

https://github.com/sufadi/AccessibilityServiceMonitor

1.需求点赞界面,进行自动点击

注意:要clickable事件为ture和有id的为主,具体箭头如下

关注界面的点赞

热点界面的点赞

好友界面的点赞

2.点击事件处理

事件输入

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        int eventType = event.getEventType();
        String packageName = event.getPackageName().toString();
        String className = event.getClassName().toString();
        // Log.d(TAG,"event = " + event.toString() );

        switch (eventType) {
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
            case AccessibilityEvent.TYPE_VIEW_SCROLLED:
                if ("com.gotokeep.keep".equals(packageName) && ("android.support.v7.widget.RecyclerView".equals(className))) {
                    // 关注界面的点赞
                    keepAppPraise("com.gotokeep.keep:id/item_cell_praise_container");

                    // 好友界面的点赞
                    keepAppPraise("com.gotokeep.keep:id/stroke_view");

                    // 热点界面的点赞
                    keepAppPraise("com.gotokeep.keep:id/layout_like");
                }
                break;

        }
    }

处理点击事件

    private void keepAppPraise(String id) {
        AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();

        if (nodeInfo != null) {
            // 该界面下所有 ViewId 节点
            List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId(id);
            for (AccessibilityNodeInfo item : list) {
                if (item.isClickable()) {
                    Log.d(TAG, "keepAppPraise = " + item.getClassName());
                    item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }
        }

    }

3.其他辅助代码

3.1 判断权限有无
    public static boolean isAccessibilitySettingsOn(Context mContext, String className) {
        int accessibilityEnabled = 0;
        final String service = mContext.getPackageName() + "/" + className;
        Log.i(TAG, "service:" + service);
        // formate: service:com.fadi.forestautoget/com.fadi.forestautoget.service.AccessibilityServiceMonitor
        try {
            accessibilityEnabled = Settings.Secure.getInt(mContext.getApplicationContext().getContentResolver(),
                    android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
            Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
        } catch (Settings.SettingNotFoundException e) {
            Log.e(TAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
        }
        TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

        if (accessibilityEnabled == 1) {
            Log.v(TAG, "***ACCESSIBILITY IS ENABLED*** -----------------");
            String settingValue = Settings.Secure.getString(mContext.getApplicationContext().getContentResolver(),
                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
            // com.z.buildingaccessibilityservices/com.z.buildingaccessibilityservices.TestService
            if (settingValue != null) {
                mStringColonSplitter.setString(settingValue);
                while (mStringColonSplitter.hasNext()) {
                    String accessibilityService = mStringColonSplitter.next();

                    Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service);
                    if (accessibilityService.equalsIgnoreCase(service)) {
                        Log.v(TAG, "We've found the correct setting - accessibility is switched on!");
                        return true;
                    }
                }
            }
        } else {
            Log.v(TAG, "***ACCESSIBILITY IS DISABLED***");
        }
        return false;
    }
3.2 跳转辅助设置界面
    public static void showSettingsUI(Context mContext) {
        Intent mIntent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
        mContext.startActivity(mIntent);
    }
3.3 配置检测参数

onServiceConnected 事件检测 或者 accessibility_config.xml 配置

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();
        serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
        serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        serviceInfo.packageNames = new String[]{"com.gotokeep.keep"};// 监控的app
        serviceInfo.notificationTimeout = 100;
        setServiceInfo(serviceInfo);
    }
3.3 AndroidManifest.xml
        <service
            android:name=".service.AccessibilityServiceMonitor"
            android:enabled="true"
            android:exported="true"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">

            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>

            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessibility_config">

            </meta-data>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值