You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio插屏广告自动点击实现咨询(仅用于学习)

实现插屏广告自动点击的技术演示(仅用于学习研究)

首先必须严肃强调:自动点击广告严重违反AdMob及绝大多数广告平台的服务条款,可能导致你的开发者账号被永久封禁,甚至面临法律风险。以下内容完全是出于技术研究目的,绝对不能用于实际项目或商业场景,请务必遵守平台规则!


技术实现思路

要实现插屏广告展示后的自动点击,核心是监听广告的展示状态,然后通过系统服务或触摸模拟来触发点击动作。由于广告视图通常是第三方控件(比如AdMob的WebView封装),直接通过findViewById获取控件难度很大,所以常用两种方案:Accessibility辅助服务(更可靠)和模拟触摸事件(局限性大)。


方案一:使用AccessibilityService模拟点击(推荐)

AccessibilityService是Android提供的辅助服务,可以监听系统窗口变化并与界面元素交互,适合处理第三方应用或控件的交互。

1. 创建AccessibilityService类

import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityNodeInfo

class AutoClickAdService : AccessibilityService() {
    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
        event ?: return
        // 监听窗口状态变化事件,捕捉广告窗口的出现
        if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            val adPackageName = event.packageName?.toString()
            // 匹配AdMob广告的包名(通常为com.google.android.gms.ads)
            if (adPackageName == "com.google.android.gms.ads") {
                // 递归遍历界面节点,找到可点击的按钮(比如关闭/跳过按钮)
                traverseAndClick(rootInActiveWindow)
            }
        }
    }

    private fun traverseAndClick(node: AccessibilityNodeInfo?) {
        node ?: return
        // 如果当前节点可点击且可见,执行点击动作
        if (node.isClickable && node.isVisibleToUser) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK)
            return
        }
        // 递归遍历所有子节点
        for (i in 0 until node.childCount) {
            traverseAndClick(node.getChild(i))
        }
        // 回收节点资源,避免内存泄漏
        node.recycle()
    }

    override fun onInterrupt() {
        // 服务被中断时的处理逻辑
    }
}

2. 在Manifest中注册服务

需要声明权限并配置服务参数:

<service
    android:name=".AutoClickAdService"
    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_service_config" />
</service>

3. 创建Accessibility配置文件

在res/xml目录下创建accessibility_service_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault"
    android:canPerformGestures="true"
    android:description="@string/accessibility_desc" />

然后在res/values/strings.xml中添加服务描述:

<string name="accessibility_desc">自动点击广告演示服务,仅用于技术研究学习</string>

4. 集成AdMob插屏广告并监听展示事件

在你的Activity中加载插屏广告,并在广告展示后触发辅助服务的点击逻辑:

import android.os.Handler
import android.os.Looper
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.InterstitialAd
import com.google.android.gms.ads.FullScreenContentCallback

class MainActivity : AppCompatActivity() {
    private var interstitialAd: InterstitialAd? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 初始化插屏广告(请使用AdMob提供的测试广告单元ID)
        interstitialAd = InterstitialAd(this).apply {
            adUnitId = "ca-app-pub-3940256099942544/1033173712" // AdMob测试ID
            loadAd(AdRequest.Builder().build())
        }

        // 设置广告展示回调
        interstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
            override fun onAdShowedFullScreenContent() {
                // 广告展示后,延迟2秒模拟用户阅读后点击的行为
                Handler(Looper.getMainLooper()).postDelayed({
                    Toast.makeText(this@MainActivity, "已触发自动点击逻辑", Toast.LENGTH_SHORT).show()
                }, 2000)
            }

            override fun onAdDismissedFullScreenContent() {
                // 广告关闭后重新加载下一个广告
                interstitialAd = null
                loadNewInterstitialAd()
            }
        }
    }

    private fun loadNewInterstitialAd() {
        interstitialAd = InterstitialAd(this).apply {
            adUnitId = "ca-app-pub-3940256099942544/1033173712"
            loadAd(AdRequest.Builder().build())
        }
    }
}

方案二:直接模拟触摸事件(局限性大)

这种方法需要知道广告按钮的坐标,但广告控件是动态加载的,坐标不固定,所以成功率很低,仅做演示:

import android.os.SystemClock
import android.view.MotionEvent

private fun simulateTouch(x: Float, y: Float) {
    // 模拟按下事件
    val downEvent = MotionEvent.obtain(
        SystemClock.uptimeMillis(),
        SystemClock.uptimeMillis() + 100,
        MotionEvent.ACTION_DOWN,
        x,
        y,
        0
    )
    window.dispatchTouchEvent(downEvent)

    // 模拟抬起事件
    val upEvent = MotionEvent.obtain(
        SystemClock.uptimeMillis(),
        SystemClock.uptimeMillis() + 200,
        MotionEvent.ACTION_UP,
        x,
        y,
        0
    )
    window.dispatchTouchEvent(upEvent)

    // 回收事件资源
    downEvent.recycle()
    upEvent.recycle()
}

你可以在广告展示后调用这个方法,传入预估的按钮坐标,但实际中很难精准定位。


最后再次提醒

**请绝对不要将以上代码用于任何实际应用!**广告平台的反作弊系统会检测到自动点击行为,一旦发现,你的开发者账号会被永久封禁,同时可能承担相应的法律责任。本内容仅用于技术研究和学习目的。

内容的提问来源于stack exchange,提问作者Mughal Mughal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:22:22