AccessibilityService新增gesturedescription使用详解,7.0模拟手势抢红包核心代码分析

目前市面上大部分抢微信抢红包外挂的都失效了,最关键的原因就是在7.0我们再通过findAccessibilityNodeInfosByText或者findAccessibilityNodeInfosByViewId来拿View已经不行了,主要是系统已经换了新的方式实现,这就是本次要分享的内容,虽然我们拿不到View,但是我们可以通过模拟手势,一样可以实现点击拆红包
下边就开始一步一步解析
首先是dispatchGesture方法的解释

boolean dispatchGesture (GestureDescription gesture, 
                AccessibilityService.GestureResultCallback callback, 
                Handler handler)

这个就是我们要实现模拟手势需要调用的方法
这个方法有三个参数:

  1. 参数GestureDescription:翻译过来就是手势的描述,如果要实现模拟,首先要描述你的腰模拟的手势嘛
  2. 参数GestureResultCallback:翻译过来就是手势的回调,手势模拟执行以后回调结果
  3. 参数handler:大部分情况我们不用的话传空就可以了
    一般我们关注GestureDescription这个参数就够了,下边就重点介绍一下这个参数

GestureDescription官网描述:

Accessibility services with the AccessibilityService_canPerformGestures property can dispatch gestures. This class describes those gestures. Gestures are made up of one or more strokes. Gestures are immutable once built. 
Spatial dimensions throughout are in screen pixels. Time is measured in milliseconds.

翻译过来大概意思:

辅助功能服务,其具有AccessibilityService_canPerformGestures属性,可发送手势。此类描述手势。手势由一个或多个笔划组成。一旦生成, 手势是不可改变的。
整个空间尺寸都以屏幕像素为单位。时间以毫秒为单位。

构建一个手势描述的关键代码:

GestureDescription.StrokeDescription(Path path, long startTime, long duration)

例如:

val builder = GestureDescription.Builder()
val gestureDescription = builder
                    .addStroke(GestureDescription.StrokeDescription(path, 100, 50))
                    .build()

参数介绍如下:

  • 参数path:笔画路径
  • 参数startTime:时间 (以毫秒为单位),从手势开始到开始笔划的时间,非负数
  • 参数duration:笔划经过路径的持续时间(以毫秒为单位),非负数

这里重点介绍path,官网描述:

ath: The path to follow. Must have exactly one contour. The bounds of the path must not be negative. The path must not be empty. If the path has zero length (for example, a single moveTo()), the stroke is a touch that doesn't move.
This value must never be null.

翻译过来大概意思就是:

Path: 要跟随的路径。必须有正好一个轮廓。路径的边界不得为负数。路径不得为空。如果路径的长度为零 (例如, 单个moveTo()), 则笔划是一个没有移动的点击

那就很清晰了,如果要模拟单机事件,直接像这样就好:

val path = Path()
path.moveTo(x, y)

注意:其中x和y表示要点击的按钮坐标相对于屏幕左上角的坐标
那如果要模拟滚动手势就可以像这样:

val path = Path()
path.moveTo(x1, y1)
path.lineTo(x2, y2)

表示模拟从第一个点滚动到第二个点,其他更复杂的手势都可以通过path模拟
至此关于模拟手势问题介绍完毕,如有疑问可留言

你可能感兴趣的:(Android,Kotlin)