【问题标题】:Injecting Touch events to another app on Android将 Touch 事件注入 Android 上的另一个应用程序
【发布时间】:2018-09-26 02:29:49
【问题描述】:

我的游戏没有内置控制器支持,但带有基于触摸的控件。我想使用游戏手柄并在 Android 中获得一些动手编程经验。

我想知道我是否可以让我的应用监听控制器事件,并将它们转发到我的游戏。

我学会了如何process controller events。然后我发现由于安全原因我无法转发它们——现在允许以编程方式发送触摸事件是有充分理由的。

根据this blog (its SSL cert expired),有三种方式注入触摸事件:

  1. 使用内部 API(容易更改,需要 root 才能发送到另一个应用程序)
  2. 使用公共 API、Instrumentation(需要 root 才能发送到另一个应用)
  3. 直接写入 /dev/input/eventX(需要 root 才能更改权限)

我发现的其他方法包括构建您自己的平台,因此您可以将您的应用程序设置为系统应用程序并使用平台证书对其进行签名,以提供所需的权限。

或者在您自己的应用程序中包装另一个应用程序,但使用 Instrumentation 发送触摸事件仍然需要 root。

我还阅读了有关 Accessibility API 的信息,但它似乎被认为是对 API 的滥用,并且将来可能是不可能的。

我宁愿不让我的设备 root,因为如果检测到 root,许多游戏都会出现问题。

我正要放弃,但后来我发现了这样的应用:

  1. Touch4Gamepad - 这个使用了称为 Arduino Board 的硬件。 Demo of Touch4Gamepad
  2. Octopus - 这似乎是我想尝试的方法,但它有相当两极分化的 cmets。它也不适用于 Google Play 服务。 Demo of Octopus
  3. DRO-CON - 这个似乎采用了完全不同的方法,通过连接的 PC 进行。
  4. TeamViewer - 似乎可以远程控制 Android,包括发送触摸事件。根据this thread,TeamViewer 与手机制造商达成协议以获得所需的权限。 Supported Manufacturers for Remote Control

尽管 Android 具有安全性,但选项 2 似乎无论如何都能做到。效果如何?

编辑:我下载了 Octopus 的 APK 并查看了里面。它包括一个名为 libinject.so... 的文件,这就是它发挥作用的地方。我现在有一个新的研究方向,但如果有人有与此相关的资源的链接,我将不胜感激。

【问题讨论】:

  • 设法弄清楚这个?
  • @hepizoj:很遗憾,没有。八达通在 Google Play 上玩得不好,所以没用。 TeamViewer 通过与制造商达成交易来实现这一目标。我尝试在 Arduino Board 论坛上询问它,但没有人回答。不确定它是否会起作用,我还不想购买 Arduino 板。
  • 是的,但是 libinject.so 呢?章鱼是怎么变魔术的? Octopus 不需要 root 访问权限、系统应用程序权限或 ROM 签名。怎么样?)
  • 我没有下载 Octupus,但如果它使用 Accessibility 权限,那么它使用的 API 已经变得更加受限,并且一些使用该 API 的恶意应用正在从 Play 商店中删除。
  • 虽然已经晚了,但你试过了吗? stackoverflow.com/a/51706446/16146250

标签: android touch


【解决方案1】:

如何处理控制器操作 [ALSO API 16+]

在系统级别,Android 将来自游戏控制器的输入事件代码报告为 Android 键代码和轴值。在您的游戏中,您可以接收这些代码和值并将它们转换为特定的游戏内操作。

当玩家将游戏控制器物理连接或无线配对到他们的 Android 设备时,系统会自动将控制器检测为输入设备并开始报告其输入事件。您的游戏可以通过在您的活动Activity 或焦点View 中实现以下回调方法来接收这些输入事件(您应该为ActivityView 实现回调,但不能同时实现两者)。

您可以在documentation 中找到更多详细信息。


支持跨 Android 版本的控制器 [API 12+]

如果您在游戏中支持游戏控制器,则您有责任确保您的游戏在运行不同 Android 版本的设备上一致地响应控制器。这让您的游戏能够覆盖更广泛的受众,并且您的玩家即使在切换或升级其 Android 设备时也可以使用其控制器享受无缝的游戏体验。

您可以在documentation 中找到更多详细信息。


单点触控事件

对于您想要控制的单点触控事件,您可以使用AccessibilityServicedispatchGesture 结合使用。但我认为这不是你真正想要的。您不想处理 Touch 本身,而是控制器正在使用的参数。这就是为什么我添加了上面的 2 段,以实现您想要的。


我添加此答案的原因

我知道这有点晚了,但直到现在还有可以接受的答案。在达到更高的 API 级别方面,知道如何处理这些东西会很有用。干杯:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多