Xposed module for Phone by Google (com.google.android.dialer). It enables Audio Emoji when a server-side flag has turned them off, lets you replace the Audio Emoji sounds with your own, and can unlock built-in call recording.
- Enable Audio Emoji when they are disabled by a server-side flag.
- Custom sounds: replace any of the six Audio Emoji sounds with your own file from a settings screen in the module app.
- No button lock: the Audio Emoji buttons are blocked only while the on-screen animation plays, not for an extra second after the sound.
- Call recording without announcement
- Pixel builds on other phones:
-pixel2026Dialer builds no longer say "This device is not supported", and Audio Emoji reach the other person (see below).
The Dialer is obfuscated and class names change between versions, so the module finds the classes it needs at runtime with DexKit by searching for stable strings. If a class is not found exactly once, the hook does nothing and writes a line to the log.
Audio Emoji sounds are sent in the caller's voice stream, so the other person hears them and does not need the module.
- Install the APK.
- Grant root permissions
- Enable the module in Vector (or LSPosed).
- Set the scope to
com.google.android.dialerand System Framework (android), then reboot. - Force-stop Phone by Google and open it again.
- Check Settings in the Phone app.
Install the new APK over the old one and force-stop Phone by Google. Releases are signed with a permanent key, so updates install without uninstalling. v1.0 was signed with a different key: if you have v1.0, uninstall it once before installing a newer version.
Newer -downloadable Dialer builds (242+) no longer contain Audio Emoji. Use a -pixel2026 build instead; the module reports the Pixel 2026 system feature to the Dialer so it stops showing "This device is not supported".
Audio Emoji are sent to the other person through the Telephony Tx audio device, which audioserver allows only for apps holding MODIFY_PHONE_STATE. On Pixel the Dialer is a privileged system app; on other phones it is not, so the sound plays only locally. The same applies to call recording, which reads the call audio and needs CAPTURE_AUDIO_OUTPUT; without it recording saves nothing. To fix both, the module hooks system_server and reports these two permissions to audioserver for the Dialer only. Enable System Framework in the module scope and reboot for this to work.
Before recording starts, the Dialer plays a disclosure. Apart from a few countries with a built-in file, it synthesizes the disclosure with the default TTS engine. If that engine has no voice for the language (for example, the OnePlus engine has no Russian), the Dialer would cancel the recording. In that case the module writes a short silent file instead, for any language.
Open the DialerPatch app. There is one block for each emoji with Choose, Play and Reset buttons. The language button switches between English and Russian.
- Any file the Dialer can play works: tested with Ogg and MP3 (including 44.1 kHz stereo). Any length, nothing is trimmed.
- The other person hears your sound too.
- The app copies the file into the Dialer's private storage using root commands, so it asks for root access. After you reinstall the app with a different signature, grant root again and restart the app.
- Reset removes your file and the original sound is used again.
The module can unlock the Dialer's built-in call recording in countries where it is disabled. The Dialer's own voice announcement that recording has started is not removed.
Recording laws differ between countries, and many require the consent of the other person. You are responsible for how you use this feature.
| Dialer version | ROM | Android |
|---|---|---|
| 241.0.991235506-publicbeta | OxygenOS 16 | 16 |
| 240.0.986973448-pixel | PixelOS | 13 |
Other versions are untested. If the Dialer updates and a hook stops working, the module searches for the classes again on the next launch.
Check the log:
su -c "logcat -d | grep -E 'DialerPatch|SonicHook|NoLockHook|RecordingHook'"Log of the module app (custom sounds screen):
su -c "logcat -d -s DialerPatchApp"If nothing shows up, make sure the module is enabled, the scope includes com.google.android.dialer, and you force-stopped the Dialer after enabling it.
./gradlew assembleDebugThe APK ends up in app/build/outputs/apk/debug/. GitHub Actions builds a signed release APK on every push; the signing key is stored in repository secrets.
This module is experimental and provided as is, without warranty of any kind. It changes the behavior of a third-party app, so use it at your own risk. The author is not responsible for any damage, data loss, or account restrictions that may result from using it. Not affiliated with or endorsed by Google.