这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
如何跳过掘金app的开屏广告(一)
不知道从什么时候开始,开屏广告几乎成了app的标配,对用户来说也是苦不堪言,如果不想等待3秒,就需要手动点击跳过。那么我们怎么让手机自动跳过呢?
一、实现思路
在绝大部分的app上,启动页开屏广告是有‘跳过’按钮的,比如掘金的app,如下开屏时间在5秒,不想等就只能点击跳过,那么我们怎么让手机自动点击跳过。
想想现在还有哪些可以自动点击的技术呢。
- root 后的设备执行shell命令
- adb 模拟点击
- 无障碍服务
AccessibilityService
实际场景上,随着权限的收紧,目前可以root设备越来越少,而adb则需要打开开发者模式,并且连接着数据线(即使用无线调试)才可以执行,适用于高端玩家。
再来看看无障碍服务。
引用一段官方的介绍
无障碍功能是所有应用的重要组成部分。无论您是要开发新应用还是改进现有应用,都应考虑应用组件的无障碍功能。 通过集成无障碍功能和服务,您可以提高应用的易用性,尤其是对于残障用户来说。
看了官方的API,发现无障碍服务有可以帮助用户进行操作的功能。
二、无障碍服务
无障碍服务AccessibilityService诞生的目的是为了给广大残障用户来使用的,但慢慢的发现了它更多的用处,主要是它可以自动点击,所以赋予了它实现多种场景能力。比如它还可以:
- 自动抢红包
- 某音自动滑动
- 秒杀抢购脚本
- 跳过开屏广告
...
既然可以实现这么多的功能,那么了解它还是有必要的,主要是他实现的都是切身实际的场景,虽然有点歪门邪道。
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": 是否可以读取窗口中的内容