相关文章推荐
  • 只需要 获取到自身应用范围内的触控点坐标
  • 前言

    本文着重介绍了Android 多点触控协议的相关知识及 adb 命令 getevent 的数据解析方法。具体的程序实现并不是本文的重点。

  • 需要 App 本身能“系统级”的 全局 获取用户的触控点坐标。并且不能影响触控操作本身。也就是说不能影响用户正常使用手机。
  • 手机 不能 ROOT。
  • 手机可以连接电脑,但是不能 一直 连接电脑。
  • 关于 需求1 的示例说明:例如,用户点击了桌面上的“日历” App,在我们自己的 App 中需要获取到用户所点击的坐标,并且用户的点击操作不能受到影响,“日历” App 是可以正常启动的。又比如用户正在玩游戏,我们需要获取到用户所有操作的触控信息。

    分析与实现方法

    分析

    如果是仅获取我们应用自身的触控信息自然是很容易的,但是我们的需求是“系统级”的获取用户触控信息,也就是说还要获取用户在其它应用上的触控信息,很显然这种操作是无法通过 App 本身来实现的,因为这属于 危险级 权限功能。

    那么,可行的方案我们很自然会想到 adb 命令 getevent 可以实现获取全局点击坐标的要求,但是该命令是无法直接在 App 里调用的。原因显而易见,这种危险级操作 App 级权限 当然是不够的,至少需要 shell 级 的权限。

    实现思路

    通过上面的分析,再结合 需求3 :手机可以连接电脑,这样的话就可以在电脑上通过 adb shell 启动一个 Android 可执行程序 ,从而让该程序拥有 shell 级 权限,这样我们就可以调用 getevent 命令获取触控信息了。之后该程序再与 App 通信,将获取到的触控信息发送给 App 即可。

    这里的关键是我们需要有一个 Android 可执行程序 。实现 Android 可执行程序 的方法也有很多,可以是 dex 也可以是其它在 Android 上编译的 C 或 C++ 程序。当然还可以使用像 Go 语言这样的编程语言,直接将程序编译成可以在 Android 上执行的程序。

    此外,我们可以在该可执行程序中创建一个守护进程,让程序一直执行,这样程序就不会随着 adb 终端的断开而停止,因此就不需要手机一直连接电脑了,从而满足 需求3 的要求。

    PS:本人是使用 Go 来实现这个 Android 可执行程序 的。

    具体的实现代码,不是本文要讲的重点。因为程序实现的思路才是最重要的,有了思路程序自然就好写了。

    正文

    先说一个结论:

    从 Android 内核 4.14 开始,仅支持多点触控协议“类型 B”。内核驱动程序会将多点触控协议“类型 A”转换成“类型 B”。[^12][^13]

    PS:部分 Android 9,10 支持内核 4.14 。Android 11 及之后版本,均支持内核 4.14 。后文会有进一步的说明。

    至于什么是多点触控协议,可以查看后文关于 多点触控协议 的说明。如何查看内核版本,以及内核版本与 Android 版本的对应关系,详见后文的 关于内核版本

    关于 getevent

    参数说明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [-R] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
    -d: show HID descriptor, if available
    -p: show possible events (errs, dev, name, pos. events)
    -i: show all device info and possible events
    -l: label event types and names in plain text
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received
    -R: print event records which can replay by replayevents

    查看输入设备支持的事件信息

     
    推荐文章