V2: perceive first, then decide
CameraX supplies camera frames, not semantic understanding. Add a deliberate Capture or Analyze gesture and pass the chosen frame to an appropriate perception component, such as OCR. Then send the extracted, reviewed text and minimal context to your decision boundary. Do not assume the Jev text integration built earlier accepts image bytes.
CameraX → OCR or vision component → reviewed context → Jev
↓
policy → Android action
For a business-card exercise, OCR might extract a name and phone number. Jev can route to REVIEW_CONTACT or ASK_USER. The app should show the extracted fields for correction before offering a save operation. Choosing REVIEW_CONTACT does not verify OCR accuracy or authorize writing contacts.
Follow CameraX image analysis guidance for lifecycle binding, backpressure and closing ImageProxy after processing. Avoid queueing every preview frame for a network call. Retain only bounded work, release resources, and test navigating away during analysis. Denied camera permission must preserve the original text workflow.
If a generative model such as Gemini is introduced for descriptions, give it a separate output contract and validate the resulting context. Escalation to another cloud model should obey the same user data choices. A request too private for one provider is not automatically acceptable to another.
V3: expose supported app capabilities
Start with a local Kotlin action registry that can create a note draft in your own app. Add an AppFunctions adapter only when you have a supported environment. Publishing a capability and being an authorized caller of capabilities are separate roles.
As checked on September 28, 2026, Android's AppFunctions overview describes an experimental preview on Android 16+, with EXECUTE_APP_FUNCTIONS required for discovery and execution. It also describes Gemini integration as a private preview. Recheck the current documentation before choosing dependencies or promising a demonstration on a particular device.
Registering an AppFunction does not let any ordinary app invoke every installed app's functions. Availability, caller authorization and the exposed schema all constrain execution. Keep a local fallback and label it accurately; directly calling your own Kotlin function is not proof of cross-app AppFunctions execution.
Practice and expected behavior
For V2, capture a fictional card, review extracted text and route to a contact-review screen. Try poor lighting, empty text, permission denial and cancellation. The app must never save inferred details automatically. Document the perception component separately from Jev.
For V3, expose one small supported function following the official guide. Validate parameters and confirm side effects inside the execution boundary, not only in the UI. Test with authorized development tooling and record the device, API level and actual execution path. If caller access is unavailable, keep the adapter disabled and document that limitation.
Checkpoint: V1 still works with both extensions disabled. Your evidence distinguishes camera capture from perception, routing from execution, and a local function call from a verified AppFunctions invocation.