在安卓系统中向另一个应用程序注入触摸事件

38

我有一个没有内置控制器支持的游戏,只能通过触摸控制。我想使用游戏手柄,并在Android上获得一些实际的编程经验。

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

我学会了如何处理控制器事件。然后我发现由于安全原因,我不能将它们转发 - 在程序上发送触摸事件是不被允许的。

根据这篇博客(其SSL证书已过期),有三种注入触摸事件的方法:

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

我找到的其他方法包括构建自己的平台,以便将应用程序设置为系统应用程序并使用平台证书签名,从而提供所需的权限。

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

我也读过关于辅助功能API的文章,但似乎这被认为是对API的误用,可能在未来是不可能的。

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

我差点放弃了,但后来我找到了这样的应用:

  1. Touch4Gamepad - 这个应用使用了叫做Arduino Board的硬件。 Touch4Gamepad的演示
  2. Octopus - 这个应用似乎是我想要尝试的方法,但是评论相当极端。 它也无法与Google Play服务一起使用。 Octopus的演示
  3. DRO-CON - 这个应用似乎采用了完全不同的方法,通过连接的PC来实现。
  • TeamViewer - 看起来可以远程控制Android设备,包括发送触摸事件。根据这个线程,TeamViewer与手机制造商达成协议以获得所需的权限。支持远程控制的厂商
  • 尽管Android有安全性,但选项2似乎仍然能够实现。它是如何做到的?

    编辑:我下载了章鱼手柄的APK并查看了其中的内容。它包括一个名为libinject.so的文件...这就是它施展魔法的地方。我现在有了新的研究方向,但如果有人有相关资源链接,我会非常感激。


    2
    你成功搞定了这个问题吗? - hepizoj
    1
    @hepizoj:很遗憾,Octopus和Google Play不兼容,所以它没用。TeamViewer通过与制造商达成协议解决了这个问题。我曾在Arduino Board论坛上询问过此事,但没有人回复。我不确定它是否有效,所以我还不想立即购买Arduino Board。 - KC Wong
    1
    是的,但是libinject.so呢?章鱼是如何做到这一点的?章鱼不需要root访问、系统应用程序权限或ROM签名。怎么做到的? - StayCool
    1
    我没有下载 Octupus,但如果它使用辅助功能权限,则说明它正在使用一个已经变得更加受限的 API,一些有恶意意图的应用正在被从 Play 商店中移除。 - Marcos Vasconcelos
    虽然有点晚了,你试过了吗?https://dev59.com/elUL5IYBdhLWcg3wI1PC#51706446 - Ananta Raha
    1个回答

    1

    如何处理控制器操作 [也适用于API 16+]

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

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

    更详细的信息可以在文档中找到。


    支持在Android各版本[API 12+]上使用控制器
    如果您的游戏支持使用控制器,那么您有责任确保您的游戏在运行不同版本的Android的设备上对控制器做出一致的响应。这可以让您的游戏覆盖更广泛的受众,并且即使玩家更换或升级他们的Android设备,他们也可以使用控制器无缝地享受游戏。更详细的内容,请参考此文档

    单点触摸事件

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


    我添加此答案的原因

    我知道现在可能有点晚了,但是至今为止还没有一个可接受的答案。而且在达到更高的API级别方面,了解如何处理这些内容是很有用的。干杯 :)


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接