Android
Native Setup
Initialize SDK and configure Android application
Application Class Setup
Initialize SDK once in your Application class:
import android.app.Application
import com.kycis.sdk.AI
import com.kycis.sdk.core.ConfirmUiText
import com.kycis.sdk.core.KycStepStrategy
import com.kycis.sdk.core.RuntimePolicy
import com.kycis.sdk.core.TriggerSettings
import com.kycis.sdk.core.TriggerStartMode
class DemoApp : Application() {
override fun onCreate() {
super.onCreate()
AI.setStatusListener { status ->
// optional logging/analytics
}
// Optional: register screen schemas BEFORE init so they are pushed at startup
// AI.registerScreenSchemas(listOf(ScreenSchema(screenId = "pan_entry", ...)))
AI.init(
application = this,
apiKey = "your-api-key",
userId = "runtime-user-id",
policy = RuntimePolicy(
// Omit backendBaseUrl to use BuildConfig.KYCIS_BACKEND_URL
// or override explicitly, e.g. "http://10.0.2.2:8000/v1" for emulator
clientId = "your_tenant_id",
mappingVersion = "v1",
appVersion = "1.0.0",
triggerStartMode = TriggerStartMode.CONFIRM_UI,
kycStepStrategy = KycStepStrategy.HINT_THEN_INFER,
triggerSettings = TriggerSettings(
autoTriggerEnabled = true,
includeErrorSignals = true,
includeTimeSpentSignals = false,
includeIdleSignals = false,
includeStepHints = true
),
confirmUiText = ConfirmUiText(
title = "Need help completing this step?",
startCta = "Start",
dismissCta = "Not now"
),
passiveEvalEnabled = true,
passiveEvalIntervalSeconds = 10
)
)
// Recommended: enables lifecycle/screen auto-observation
AI.attach(this)
}
}Manifest Declaration
<application
android:name=".DemoApp"
android:label="@string/app_name"
... />Required Permissions
In AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />Runtime permission handling for RECORD_AUDIO is handled by SDK if you use AI.attach() with FragmentActivity.
SDK Module Integration
Option 1: Local Module
// settings.gradle.kts
include(":kycis-sdk")
project(":kycis-sdk").projectDir = file("../KYCIS/android-sdk/sdk")
// app/build.gradle.kts
dependencies {
implementation(project(":kycis-sdk"))
}Option 2: Composite Build (KYCISDemo-style)
// settings.gradle.kts
includeBuild("../KYCIS/android-sdk") {
dependencySubstitution {
substitute(module("com.kycis:kycis-sdk")).using(project(":sdk"))
}
}
// app/build.gradle.kts
dependencies {
implementation("com.kycis:kycis-sdk:1.0.0") // resolved to :sdk
}Lifecycle and Passive Signals
When AI.attach is used:
onActivityResumed: binds current activity, observes screen name, records user interaction- PassiveTracker derives time on current screen and idle seconds from last interaction
If attach is never called, trackError emits SdkStatusCode.REDUCED_TRACKING_MODE once.
Permission Forwarding
If your activity needs custom permission handling:
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (AI.onRequestPermissionsResult(requestCode, permissions, grantResults)) return
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}Backend Client Abstraction
HttpBackendClient: production implementationNoOpBackendClient: no network; trigger always false; useful for tests
All paths are relative to backendBaseUrl (must include /v1).