I have a game without built-in controller support, with touch-based controls. I would like to use a gamepad with it and get some hands-on programming experience in Android.
I want to figure out if I can have my app listen for controller events, and forward them to my games.
I learned how to process controller events. Then I found out I cannot forward them due to security - programmatically sending touch events is now allowed for good reasons.
According to this blog (its SSL cert expired), there are three ways to inject touch events:
- Using internal APIs (prone to change, need root to send to another app)
- Using the public API, Instrumentation (need root to send to another app)
- Write directly to /dev/input/eventX (need root to change permissions)
Other methods I have found include building your own platform, so you can set your application as a system app and sign it with the platform certificate, to provide it with the required permissions.
Or wrapping another application within your own, but using Instrumentation to send touch events there still require root.
I have also read about the Accessibility API, but it looks like it is considered a misuse of the API and maybe impossible in the future.
I would rather not root my device, as many games have issues if they detect root.
I was about to give up, but then I found apps like these:
- Touch4Gamepad - This one makes use of hardware called the Arduino Board. Demo of Touch4Gamepad
- Octopus - This one seems to be the approach I want to try, but it has pretty polarizing comments. It also does not work with Google Play service. Demo of Octopus
- DRO-CON - This one seems to take an entirely different approach by doing it via a connected PC.
- TeamViewer - It seems to be able to remote control Android including sending touch events. According to this this thread, TeamViewer struck a deal with phone manufacturers to get the required permissions. Supported Manufacturers for Remote Control
Despite Android security, options 2 seem to be able to do it regardless. How is it doing it?
EDIT: I downloaded Octopus' APK and took a look inside. It includes a file named libinject.so... so that's where it is doing its magic. I have a new direction to research now, but if anyone has links to resources related to this I would really appreciate it.