Feature Secure Capture — Real-Time, On-Device, No Storage Purpose Analyze frames from the front-facing camera entirely on device to enhance fraud detection— no images are stored or transmitted; only metadata/results are sent . How it works App decides when to activate (e.g., after login, during a transfer, or only in high-risk flows). startCapture() checks camera permission and begins periodic frame analysis locally. Frames are processed on device; images are deleted immediately after analysis. Only analysis results/metadata are sent to your backend.  Capture ends when the app calls stopCapture(). Required permission (AndroidManifest.xml) SDK methods & returns startCapture() → SUCCESS | MISSING_PERMISSIONS stopCapture() → SUCCESS Usage example (Kotlin) val result = collectorAgent.startCapture() if (result == "MISSING_PERMISSIONS") { // Request CAMERA permission before retrying } // ... perform secured flow ... collectorAgent.stopCapture() UI guidance (pre-permission message)} “To enhance security, the app will analyze images from your device’s front-facing camera. No images are stored or uploaded.” Security & privacy notes No images ever leave the device; only minimal metadata/results are transmitted. Immediate buffer deletion after analysis; follow data minimization best practices. Common scenarios Post-login environment validation Extra check during standard transfers High-risk events (new payee, unusually large amount) Next steps  Add CAMERA permission.  Explain purpose to users.  Integrate startCapture()/stopCapture() in the chosen flow(s).  Handle permission gracefully. 5) Roll out gradually and monitor analytics. Secure Call Verification — Verify Bank-Initiated Calls Purpose Let the app confirm whether an incoming/recent call was genuinely initiated by the bank—helping stop voice phishing and number spoofing. System architecture Bank Call Center reports each outbound call to the Secure Call backend. Secure Call Backend records the call data. Mobile App + SDK queries the backend and displays verification status. Server-to-server API (ReportCall) Endpoint: POST /api/v1/ReportCall Fields: phone_number (req), uid (req), call_reason (opt), call_team (opt), call_agent (opt) Example (curl) curl -X POST "https://securecall.example.com/api/v1/ReportCall" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "phone_number": "+15551234567", "uid": "123456789", "call_reason": "Verify Transaction", "call_team": "Fraud Department", "call_agent": "John Smith" }' Android SDK integration Permission (AndroidManifest.xml): If missing, CheckCallStatus() returns UNKNOWN . SDK method val result = collectorAgent.CheckCallStatus() Statuses CALL_APPROVED — Legitimate bank-initiated call (active or recent) UNAPPROVED_RECENT_CALL — Recent call detected but not reported → potential fraud NO_RECENT_CALL — No active/recent call UNKNOWN — Insufficient info (incompatibility or missing permission)   Sample returns Legitimate: { "STATUS": "CALL_APPROVED", "CALL_REASON": "Verify Transaction", "CALL_TEAM": "Fraud Department", "CALL_AGENT": "John Smith" } Unapproved: { "STATUS": "UNAPPROVED_RECENT_CALL" } No call: { "STATUS": "NO_RECENT_CALL" } UI recommendations CALL_APPROVED → Green banner: “This call is verified.” (show agent + reason) UNAPPROVED_RECENT_CALL → Yellow warning: “Be cautious—possible fraud.” UNKNOWN → Gray info: “Unable to verify call status.” End-to-end example Agent calls customer and backend sends ReportCall . Customer opens the app during the call. App invokes CheckCallStatus() and receives CALL_APPROVED . App shows green banner with agent/team/reason. SIM Change Detection — Android Background Service Continuously monitor SIM state changes to help mitigate SIM-swap account takeovers. Runs silently in the background and sends only non-sensitive metadata for risk scoring. High-level flow User installs/opens the banking app with the SDK. A lightweight background service starts automatically (and after reboots). Service periodically checks SIM state allowed by Android. If the current SIM differs from the baseline, an event is triggered. Event (NO_CHANGE | SIM_CHANGED | UNKNOWN) + session metadata is sent securely to the backend.   Required permission (AndroidManifest.xml) Notes: Android 10+ restricts some identifiers; behavior varies by OEM. Event types NO_CHANGE — SIM unchanged SIM_CHANGED — SIM differs from baseline UNKNOWN — SIM info unavailable on device/OS Example payload to backend { "device_id": "abcd-1234", "timestamp": "2025-09-16T15:00:00Z", "sim_status": "SIM_CHANGED", "carrier": "CarrierName", "os_version": "Android 14", "sdk_version": "2.1.0" } Security & privacy No SMS/contacts/phone numbers are read; only SIM status + technical metadata. TLS 1.2+ for transport; designed for data minimization. Limitations & compatibility Android-only; newer Android versions/OEMs may mask info. Dual-SIM devices may complicate detection; not available on iOS. Maintain a tested device/OS compatibility list and validate before rollout. Next steps Add permission. 2) Initialize background service at app start. 3) Ingest events server-side. 4) Combine with other signals for scoring. 5) Validate on your device matrix pre-production.