如何跳过掘金app的开屏广告(一)

467 阅读3分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

如何跳过掘金app的开屏广告(一)

不知道从什么时候开始,开屏广告几乎成了app的标配,对用户来说也是苦不堪言,如果不想等待3秒,就需要手动点击跳过。那么我们怎么让手机自动跳过呢?

一、实现思路

在绝大部分的app上,启动页开屏广告是有‘跳过’按钮的,比如掘金的app,如下开屏时间在5秒,不想等就只能点击跳过,那么我们怎么让手机自动点击跳过。

1.jpg

想想现在还有哪些可以自动点击的技术呢。

  1. root 后的设备执行shell命令
  2. adb 模拟点击
  3. 无障碍服务AccessibilityService

实际场景上,随着权限的收紧,目前可以root设备越来越少,而adb则需要打开开发者模式,并且连接着数据线(即使用无线调试)才可以执行,适用于高端玩家。

再来看看无障碍服务。

引用一段官方的介绍

无障碍功能是所有应用的重要组成部分。无论您是要开发新应用还是改进现有应用,都应考虑应用组件的无障碍功能。 通过集成无障碍功能和服务,您可以提高应用的易用性,尤其是对于残障用户来说。

看了官方的API,发现无障碍服务有可以帮助用户进行操作的功能。

二、无障碍服务

无障碍服务AccessibilityService诞生的目的是为了给广大残障用户来使用的,但慢慢的发现了它更多的用处,主要是它可以自动点击,所以赋予了它实现多种场景能力。比如它还可以:

  1. 自动抢红包
  2. 某音自动滑动
  3. 秒杀抢购脚本
  4. 跳过开屏广告

...

既然可以实现这么多的功能,那么了解它还是有必要的,主要是他实现的都是切身实际的场景,虽然有点歪门邪道。

2.1 无障碍服务基本使用

由于无障碍服务来自系统服务,我们需要创建一个Service继承系统的AccessibilityService

public class MyService extends AccessibilityService {

}

在Manifest文件中添加该服务。

     <service
            android:name=".service.MyService"
            android:label="@string/accessibility_label"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <!-- 这个声明是对这个AccessibilityService的配置 -->
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessible_service_config" />
        </service>

其中android:label的含义是无障碍服务的名称,在设置->无障碍 可以找到该名称的列表。

android:resource="@xml/accessible_service_config"代表的是该无障碍服务的配置,比如 无障碍服务的描述、监听的事件、反馈类型等。

然后创建xml目录,在目录中创建accessible_service_config的xml文件。

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewClicked|typeViewScrolled|typeWindowStateChanged|typeWindowContentChanged|typeViewTextSelectionChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagReportViewIds|flagIncludeNotImportantViews"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_description"
    android:notificationTimeout="100"
    android:packageNames="@null" />

android:description: 无障碍服务的描述信息 android:packageNames: 代表监听的包名,用逗号隔开,接收所有就不设置 android:accessibilityEventTypes: 事件过滤,需要接收的事件在这里声明 android:accessibilityFeedbackType: 反馈类型,给用户的回馈方式 android:canRetrieveWindowContent="true": 是否可以读取窗口中的内容