Skip to main content
This is an enterprise-only feature. Please contact us to enable.
The same headless architecture as iOS: render your own native list, and drive a hidden WebView that runs the Dynamic SDK and returns results (including message and transaction signatures) over a JS bridge. No wallet SDK in the app. The basic Android flow is the recommended default.
No SDK in your app. Your app links no wallet SDK. It needs a hidden WebView pointed at the hosted engine page (https://your-connect-page.example/headless.html, set as ENGINE_URL in FireblocksHeadlessConnect) and your URL scheme. All WalletConnect / MetaMask / Phantom logic (and the wallet list) comes from that hosted view. Same bridge contract as iOS.
Copy FireblocksHeadlessConnect.kt in addition to FireblocksConnect.kt (visible fallback).

1. Get the wallet menu (no static file)

The engine derives the list live from the Dynamic catalog and pushes it over the bridge (a wallets message). Set FireblocksHeadlessConnect.onWallets.

2. Drop in FireblocksHeadlessConnect

Owns a hidden WebView, bridges to it (addJavascriptInterface + evaluateJavascript), opens the wallet deeplink it returns, and calls you back. Pre-warm it at launch.
MainActivity.kt
FireblocksHeadlessConnect.kt

3. Sign a message

The hosted engine supports window.headlessConnect.sign. After a successful connect, invoke sign() with any string. The wallet app prompts the user; the callback delivers a hex signature.
Sample harness update needed. The FireblocksHeadlessConnect.kt sample currently handles connect only. Add sign() / signTransaction() methods and their bridge handlers following the same pattern as the iOS and Flutter harnesses. The bridge protocol is identical.
MainActivity.kt
Only available for wallets connected through the headless engine. Visible-flow wallets do not hold an open session.

4. Sign a transaction

Pass a serialized transaction. Signing only, no broadcast.
MainActivity.kt (EVM)
MainActivity.kt (Solana)

5. Wire the manifest and redirect

Beyond the basic flow, headless needs two manifest additions: a phantom-headless host on the same FireblocksRedirectActivity intent-filter, and a <queries> block so the app can open wallet deeplinks on Android 11+.
AndroidManifest.xml
Route the return activity to the engine first (for Phantom’s redirect), then fall through to the visible flow:
FireblocksRedirectActivity
The hidden WebView needs the INTERNET permission. Do not call webView.onPause() on it. That suspends the relay socket.

6. Render the list (your UI)

MainActivity is a sample list (search, chain picker, connecting state, auto-fallback) you would swap for your own design.
MainActivity.kt

7. The bridge (for reference)

Identical to iOS.
bridge messages

Common pitfalls

  • Do not call webView.onPause() on the hidden WebView. That suspends its relay socket.
  • Cancellation is not auto-detected by Custom Tabs. Treat resumed-with-no-result as cancelled, or hold the pending flow in a ViewModel.
  • Test on a device with a wallet installed, not a bare emulator.
  • Serve over HTTPS. The flow mints WalletConnect URIs via WebCrypto.
Last modified on August 10, 2026