Help and FAQ
Set up the Oppo Find X9 Snap Key, fix detection problems, and understand what access the app needs.
Getting started
You need a Find X9 and either Shizuku or a USB cable and computer. No root or paid tools are required. Other devices and ColorOS versions may behave differently.
First, download SnapKeyMap-*.apk from the latest release and open it. Allow your browser or file manager to install apps when Android asks. No GitHub account is needed.
Open SnapKey Map to start the seven-step wizard. It saves your progress and resumes at the first unfinished step; optional skips are saved too.
Choose a method
Choose Shizuku for setup without a computer, or Computer (ADB) for one command over USB.
Give log access
Follow the instructions for your chosen method. Keep Shizuku running and allow SnapKey Map in it for prompt-free reading. Otherwise, choose Allow when Android asks for device logs.
Turn on accessibility
Tap Open accessibility settings and turn on SnapKey Map. Even with ADB or Shizuku, the service runs accessibility actions, opens apps and the device-logs prompt from the background, receives supported key events, and helps keep the app running. It cannot read screen content. If Android blocks the switch, open App info, tap the three-dot menu, choose Allow restricted settings, then retry.
Background operation (optional)
Allow the battery-optimisation exemption to reduce ColorOS interruptions, or tap Skip. This does not guarantee background detection.
Notifications (optional)
Allow alerts when detection pauses, or tap Skip. Actions do not need notification permission.
Teach the key
Set Oppo's own Snap Key action to None in phone Settings. Start teaching, press three times when asked, then hold once.
Choose actions
Tap Press, Double press, or Press & hold and keep at least one action assigned. Tap Finish, test each gesture, and check Last: on the home screen.
Use Help > Run setup again to revisit the wizard without clearing mappings. Existing installations with a taught key and granted log permission go straight to the home screen.
With a computer
This grants log access once. Android can still ask for device-log consent when the reader reconnects.
- Download Google's free SDK Platform-Tools and unzip them.
- On the phone, open Settings > About device > Version. Tap the build or version number seven times to enable Developer options.
- Turn on USB debugging in Developer options.
- Connect the phone with a USB cable. Accept the debugging prompt on the phone.
- Open a terminal in the unzipped
platform-toolsfolder and run:
adb shell pm grant com.heykay.snapkeymap android.permission.READ_LOGSIn Windows PowerShell, use .\adb instead of adb if it is not on your PATH. Success normally returns to the command prompt without a message.
Reopen SnapKey Map and allow device logs. The grant survives restarts and app updates. If the command reports GRANT_RUNTIME_PERMISSIONS, use the ColorOS fix below.
Without a computer
- Install Shizuku and follow its Wireless debugging pairing and start instructions. Wireless debugging requires Android 11 or later.
- In the wizard, choose Shizuku and continue to log access. Once Shizuku is running, tap Grant with Shizuku and allow the Shizuku permission request. The button is enabled only while Shizuku is running.
- Keep Shizuku running. While SnapKey Map is allowed in it, the app reads logs through Shizuku without Android's device-logs prompt.
If ColorOS blocks the grant, follow the permission monitoring fix, restart the phone, start Shizuku again, and retry.
Shizuku must be running for prompt-free reading. Otherwise Android asks for one-time device-log access after each app or phone restart and may ask again when the reader reconnects. The accessibility service tries to show the prompt automatically. If ColorOS blocks it, reopen SnapKey Map and allow device logs.
Manual fallback with aShell
If needed, open aShell while Shizuku is running and allow aShell to use Shizuku. Run the same permission grant directly in its shell, without the adb shell prefix:
pm grant com.heykay.snapkeymap android.permission.READ_LOGSReturn to SnapKey Map and allow device logs. aShell cannot bypass ColorOS permission monitoring either.
Teaching the key
First set Settings > Snap Key to None. Otherwise Oppo's action may run as well as yours.
In SnapKey Map, start Teach the app your Snap Key. Follow the hands-off prompt, press the key three times when asked, then hold it once. Keep the app open throughout.
To repeat teaching, choose Teach the Snap Key again on the home screen; to revisit the full wizard, choose Run setup again in Help. Your action assignments stay unchanged. After updating from v1.0.3 or earlier, teach it again before testing. Older calibration can select a message that matches only key-down events and merges double presses. Current learning prefers the known Oppo press-and-release source when present.
Choosing actions
Tap Press, Double press, or Press & hold on the home screen. Choose an app, supported shortcut, link, or device action. Test it and check the Last: text in the Ready card.
- A double-press assignment adds a 350 ms wait after release before the single-press action runs.
- The known Find X9 log reports press and release edges. Other learned log formats need repeated events while held to detect a hold.
- The shortcut picker supports apps that offer
ACTION_CREATE_SHORTCUT, not every pinned shortcut. Try a deep link instead. Direct-dial shortcuts are not supported because the app has no calling permission. - Silent mode and Do Not Disturb need notification policy access. Without it, the ringer action cycles between ring and vibrate.
- Android permissions, device support, and the lock screen still apply. The app cannot bypass the lock screen. Screen-off detection and background reliability depend on ColorOS.
Troubleshooting
Paused after a restart
Reopen SnapKey Map and allow device logs again. If it shows Paused, tap Connect. You do not need to repeat the ADB grant unless you uninstalled the app or revoked the permission.
If you declined the prompt, wait a minute before retrying. Check that accessibility remains enabled and ColorOS allows background activity.
The key is not detected
Set Oppo's own Snap Key action to None, then choose Teach the Snap Key again. Confirm that the service is enabled and device logs are allowed. Test with the app open and check Last:.
A double press is read as two singles
Set Oppo's action to None. Update to the latest app and teach the key again. Older learning can miss the release events needed to separate gestures. v1.0.3 and later fix duplicate events in the recorded Find X9 format.
Keep SnapKey Map open and check Last: after double-pressing. If it says press, detection did not recognise the double press. If it says double press, check the assignment and that the chosen app is still installed.
ColorOS keeps closing the app
Open App info > Battery and allow background activity. Turn off battery optimisation for SnapKey Map, or revisit the wizard's background operation step using Help > Run setup again. Allow notifications so you can see when detection pauses. These settings reduce interruptions, but do not guarantee background or screen-off detection.
The grant is refused with GRANT_RUNTIME_PERMISSIONS
An error containing Neither user 2000 and GRANT_RUNTIME_PERMISSIONS means ColorOS is blocking shell permission grants. This affects both ADB and Shizuku.
- Open Developer options and turn on Disable permission monitoring. Newer firmware may call it Disable system optimization.
- If neither appears, temporarily change the system language to English, United States and reopen Developer options.
- Read the warning before accepting. This relaxes manufacturer restrictions and may increase background power use.
- RESTART the phone. On ColorOS 16 the change only takes effect after a restart. Reconnecting the cable is not enough.
- Retry the grant command. For Shizuku, start it again first.
Names and locations vary by firmware. These device notes were checked on a Find X9 running ColorOS 16, CPH2797_16.0.10.600. If the setting is missing, include your ColorOS version in a report.
Still stuck? Open an issue with the app version, ColorOS version, assignments, and Last: text. Do not share an unfiltered system log. It can contain sensitive information.
Is it safe?
READ_LOGS granted over adb is a powerful permission. Give it only to apps you trust. It grants access to the whole live system log, not just the Snap Key.
What stays on the phone
The app declares no INTERNET permission. It does not send logs or settings off the phone. Apps and websites you open through an action handle their own data and have their own privacy policies.
The reader checks incoming log lines in memory. It does not save a log file. Outside teaching, matching lines drive key detection and other lines are discarded.
If you allow SnapKey Map in Shizuku, the app also uses Shizuku to run logcat as the shell user. Shizuku must be running for this. Lines are still checked in memory and discarded, with the teaching exception below. Shizuku is not used to run mapped actions.
During teaching, it temporarily keeps observations in memory: an arrival time, log tag, normalized message, and writer UID. Runs of message digits are replaced with #, and the message is trimmed and limited to 160 characters. This does not remove all sensitive text. Tags and UIDs are retained. Accessibility key-code observations can also be kept during teaching.
After learning, the app saves one selected log signature, not the collected log: the tag, normalized message, and writer UID, plus hold detection and release timing settings. If Android supplies a usable key event instead, it saves the key and scan codes rather than a log signature. The observation list is not written to storage and is released after learning finishes or is cancelled.
How key lines are checked
A learned key line must match the writer UID recorded during teaching, as well as the tag and normalized message. The known Oppo key line is accepted only from the system UID, 1000. Other apps cannot fake a Snap Key press just by writing the same line under their own UID.
Accessibility and settings
The accessibility service can receive supported key events and perform device actions. Its configuration sets canRetrieveWindowContent="false", so it cannot read window content.
Settings use private app storage. Android backup is disabled with allowBackup="false". Mappings and the learned key are not included in Android backups.
Declared permissions
The app's permission list contains:
- Read device logs (
READ_LOGS): detect the Snap Key in the live system log. - Vibrate (
VIBRATE): give feedback when an assigned action runs. - Show notifications (
POST_NOTIFICATIONS): tell you when detection pauses. - Access notification policy (
ACCESS_NOTIFICATION_POLICY): use Do Not Disturb and silent-mode controls. - Ask to ignore battery optimisation (
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS): request background operation. - Shizuku API access (
moe.shizuku.manager.permission.API_V23): lets the app ask Shizuku for the one-time log permission grant and run logcat as the shell user while Shizuku is running. This avoids the device-logs prompt. Without it, Android asks for one-time access after each app or phone restart and may ask again on reconnect. Mapped actions do not use Shizuku. - Internal receiver permission (
com.heykay.snapkeymap.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION): added by the AndroidX library. Only this app holds it, and it keeps other apps from sending broadcasts to the app's private receivers.
The code is open source. You can inspect the implementation and build it yourself.
Provided as is, without warranty.
Updates and removal
Install the new APK over the old app. Do not uninstall first. Updates signed with the same key keep settings and the granted log permission. Android may still ask for device-log consent when the reader reconnects.
Uninstalling removes the app's settings and log permission. If you reinstall, grant log access and teach the key again.