MX3 Button Mapper
button does, instead of turning the volume up three steps.
* The button the MX3 uses to light up its keypad no longer also turns
the volume down -- it now passes through untouched.
It works by combining two Android mechanisms:
• An Accessibility Service that listens for raw scancodes system-wide and can consume (swallow) the original button press.
• Shizuku, used to inject a replacement keycode or press sequence in place of the original one. Shizuku grants this using the same shell-level privileges 'adb shell input keyevent' already has, so no root is required. If Shizuku isn't connected but the device is rooted, the app falls back to injecting keys via 'su' instead, and so will ask your root manager for superuser access.
Supported mapping types (a ready-made default mapping set is built in, so there is nothing to configure per button):
• Remap a button to a different keycode (e.g. a stray Page Up/Page Down button remapped to proper Channel Up/Channel Down).
• Fire the same keycode several times in one press (e.g. a single button that sends five D-pad presses to jump through a list).
• Remap a button differently depending on which app is in the foreground (e.g. Channel Up/Down inside the TV app, a single Page Up/Page Down inside Kodi, and a burst of D-pad presses to jump through lists everywhere else).
• Launch an app directly from a button press, while holding the same button still sends its normal long-press (e.g. tapping Home opens MX3 Launcher, holding it long-presses Home).
In-app settings:
• TV brand (TCL or Blaupunkt), since these TVs expect different keycodes for the remote's TV button and use different live-TV apps.
• Optional key-press logging for troubleshooting, off by default.
• App language, with the interface translated into around 100 languages.
The app also sets itself up via Shizuku: once you agree to the in-app disclosure, it enables its own Accessibility Service for you, so there is no need to dig through Settings -> Accessibility by hand, it can launch your chosen launcher on startup, and on TCL TVs it re-grants the auto-start permission that TCL's firmware otherwise removes, so the mapper keeps working after a reboot.
Note: some of the default mappings launch specific third-party apps for convenience (e.g. jumping straight to a launcher, a video app or a browser).
Accessibility Service API use:
This app uses the Accessibility Service API for its core function. The service:
• Receives hardware key events from your remote so it can replace specific buttons with a different key, a burst of key presses, or an app launch. Buttons that aren't mapped pass through untouched.
• Receives window-change events only to learn the package name of the app on screen, so a button can behave differently inside the TV app.
It does not read screen content, text or passwords. No key presses or other data are collected, stored (unless you turn on the optional troubleshooting logs, which stay on the device) or shared -- the app has no internet access. The service is only turned on after you agree to an in-app disclosure, and you can turn it off at any time in Settings -> Accessibility.
- Author: evilbunny
- License: The Unlicense
- Issue Tracker
- Source Code
- Changelog
- Build Metadata
- Reproducibility Status
Donate
Versions
Although APK downloads are available below to give you the choice, you should be aware that by installing that way you will not receive update notifications and it's a less secure way to download. We recommend that you install the F-Droid client and use that.
Download F-Droid-
arm64-v8aarmeabi-v7ax86x86_64This version requires Android 8.0 or newer.
It is built and signed by the original developer, and guaranteed to correspond to this source tarball.
Download APK 1.5 MiB PGP Signature | Build Log
-
arm64-v8aarmeabi-v7ax86x86_64This version requires Android 8.0 or newer.
It is built and signed by the original developer, and guaranteed to correspond to this source tarball.
Download APK 1.5 MiB PGP Signature | Build Log
and why, and asks for your agreement before turning it on -- it is
never enabled without your consent.
* The Accessibility Service now only asks Android for the window
changes it actually needs, rather than every accessibility event.

