
Build Zoom Virtual Agent
Embed Zoom Campaign virtual-agent flows in an Android app via WebView, JS bridges, and URL handoff policies.
Overview
Build Zoom Virtual Agent is an agent skill for the Build phase that documents Android WebView lifecycle and JS-bridge patterns for Zoom Campaign virtual agents.
Install
npx skills add https://github.com/anthropics/knowledge-work-plugins --skill build-zoom-virtual-agentWhat is this skill?
- 7-step Android WebView lifecycle from intent build through exit cleanup
- Kotlin inject patterns for zoomCampaignSdk:ready native exit and common handlers
- support_handoff event relay via dedicated AndroidHandoff bridge
- shouldOverrideUrlLoading and multi-window rules for in-app vs external browser
- Links to Zoom developer docs for virtual-agent implementation
Adoption & trust: 830 installs on skills.sh; 19.6k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need to host Zoom’s campaign SDK in Android but lack a clear sequence for WebView setup, bridge injection, handoffs, and safe URL routing.
Who is it for?
Indie Android developers embedding Zoom virtual-agent campaigns with WebView and custom native handlers.
Skip if: Teams building only server-side Zoom bots, pure desktop web apps without WebView, or flows that skip Zoom’s campaign SDK.
When should I use this skill?
You are implementing or refactoring Android WebView hosting for Zoom Campaign / virtual-agent flows and need bridge and URL-handoff patterns.
What do I get? / Deliverables
After following the skill you have ordered lifecycle steps and Kotlin bridge templates wired for exit, common events, and support handoff before you ship the embedded agent.
- Configured WebView with injected bridges and handoff handlers
- Documented exit and cleanup behavior for the agent session
Recommended Skills
Journey fit
Canonical shelf is Build because the skill documents native Android integration patterns for loading and controlling the Zoom campaign experience. Integrations fits best: WebView config, JavaScript bridges, and external URL governance are third-party SDK wiring, not generic UI layout.
How it compares
Use as a procedural Android integration guide—not as a generic React UI kit or an MCP server wrapper.
Common Questions / FAQ
Who is build-zoom-virtual-agent for?
Solo and small-team Android builders integrating Zoom Campaign virtual agents who want WebView lifecycle and bridge patterns in one place.
When should I use build-zoom-virtual-agent?
During Build integrations when you configure WebView, inject zoomCampaignSdk bridges, or implement support_handoff and URL override policies before shipping the in-app agent.
Is build-zoom-virtual-agent safe to install?
Review the Security Audits panel on this Prism page and treat bridge code that executes JavaScript and opens URLs as sensitive—validate domains and handoff payloads in your own app review.
SKILL.md
READMESKILL.md - Build Zoom Virtual Agent
# Android WebView Lifecycle 1. Build intent with URL and policy flags. 2. Configure WebView (`JavaScriptEnabled`, optional multi-window support). 3. Inject user context config before page interaction. 4. Inject bridge script on `zoomCampaignSdk:ready`. 5. Handle callbacks via `@JavascriptInterface`. 6. Route URL actions and handoff payloads. 7. Close view and clean references on exit. # Android JS Bridge Patterns ## Inject Native Bridge ```kotlin private fun injectJavaScriptFunction() { val js = """ javascript: window.addEventListener('zoomCampaignSdk:ready', () => { if (window.zoomCampaignSdk) { window.zoomCampaignSdk.native = { exitHandler: { handle: function() { AndroidExit.handleExit(); } }, commonHandler: { handle: function(e) { AndroidCommon.handleCommon(JSON.stringify(e)); } } }; } }); """.trimIndent() webView.loadUrl(js) } ``` ## Handoff Relay ```kotlin private fun injectHandoffFunction() { val js = """ javascript: window.addEventListener('support_handoff', (e) => { AndroidHandoff.handleHandoff(JSON.stringify(e.detail)); }); """.trimIndent() webView.loadUrl(js) } ``` ## URL Governance - Use `shouldOverrideUrlLoading` for in-app vs system-browser policy. - Use multi-window callbacks for `target="_blank"` handling. # Android Reference Map ## Core Docs - Get started: https://developers.zoom.us/docs/virtual-agent/android/get-started/ - Integration scenarios: https://developers.zoom.us/docs/virtual-agent/android/integration-scenarios/ - JavaScript events: https://developers.zoom.us/docs/virtual-agent/android/javascript-events/ - Resources: https://developers.zoom.us/docs/virtual-agent/android/resources/ ## Observed Sample Patterns - Java and Kotlin implementations follow the same bridge contract. - Bridge command routing centers around `commonHandler` JSON payloads. - `support_handoff` events are emitted from JS and consumed in native layer. --- name: virtual-agent/android description: "Zoom Virtual Agent Android integration via WebView. Use for Java/Kotlin bridge callbacks, native URL handling, support_handoff relay, and lifecycle-safe embedding." user-invocable: false triggers: - "virtual agent android" - "android webview zva" - "zoomCampaignSdk:ready android" - "support_handoff android" - "javascriptinterface" --- # Zoom Virtual Agent - Android Official docs: - https://developers.zoom.us/docs/virtual-agent/android/ ## Quick Links 1. [concepts/webview-lifecycle.md](concepts/webview-lifecycle.md) 2. [examples/js-bridge-patterns.md](examples/js-bridge-patterns.md) 3. [references/android-reference-map.md](references/android-reference-map.md) 4. [troubleshooting/common-issues.md](troubleshooting/common-issues.md) ## Integration Model - Host campaign URL in Android WebView. - Inject runtime context (`window.zoomCampaignSdkConfig`). - Register JavaScript bridge for `exitHandler`, `commonHandler`, `support_handoff`. - Apply URL policy via `shouldOverrideUrlLoading` and optional multi-window callbacks. ## Hard Guardrails - Initialize handlers before expecting JS callbacks. - Treat legacy `openURL` command handling as compatibility path only. - Prefer DOM links or `window.open` handling plus explicit native routing. ## Chaining - Product-level patterns: [../SKILL.md](../SKILL.md) - Contact Center mobile scope: [../../contact-center/android/SKILL.md](../../contact-center/android/SKILL.md) # Android Common Issues ## Bridge Callback Never Fires - Ensure JS bridge injection runs after page load and SDK readiness. - Ensure `addJavascriptInterface` names match injected handler names. ## Link Opens in Wrong Context - Implement both `shouldOverrideUrlLoading` and multi-window behavior. - Distinguish `_self` and `_blank` paths explicitly. ## Deprecated `openURL` Path - Avoid relying on `{"cmd":"openURL"...}` as primary flow. - Prefer