Skip to main content
Sessions required

Every yes:id SDK module needs a valid session before it can run. Complete the Sessions Guide first — it takes 5 minutes and is required before the code below will work.

Using the Document Reader SDK

Prerequisites — create a session first

YesidSessionManager.setup(
api = "YOUR_API_KEY",
publishable = "YOUR_PUBLISHABLE_KEY",
consumerUsername = "YOUR_USERNAME"
)

Camera mode

import com.yesid.card_detection.ocr.YesidOCRCamera
import com.yesid.card_detection.ocr.domain.OCRResponse
import com.yesid.card_detection.ocr.presentation.OCRConfigurationBuilder
import com.yesid.card_detection.ocr.presentation.OCR_MODE

@Composable
fun DocumentScanScreen(sessionId: String) {
YesidOCRCamera.OCRCamera(
configurationBuilder = OCRConfigurationBuilder
.setSessionID(sessionId)
.setOCRMode(OCR_MODE.camera),
onResults = { result: OCRResponse ->
val name = result.documentText["Given Names"]
val docNum = result.documentText["Document Number"]
val portrait = result.documentImages["Portrait"]
}
)
}

Camera mode with back-side capture

YesidOCRCamera.OCRCamera(
configurationBuilder = OCRConfigurationBuilder
.setSessionID(sessionId)
.setOCRMode(OCR_MODE.camera)
.setRequireBackSide(true),
onResults = { result -> }
)
YesidOCRCamera.OCRCamera(
configurationBuilder = OCRConfigurationBuilder
.setSessionID(sessionId)
.setOCRMode(OCR_MODE.upload)
.setRequireBackSide(false),
onResults = { result -> }
)

Configuration reference

MethodTypeDefaultDescription
setSessionID(id)StringRequired. Session ID
setOCRMode(mode)OCR_MODEcameracamera or upload
setRequireBackSide(flag)BooleanfalseCapture front and back
setLensFacing(facing)IntLENS_FACING_BACKCamera lens
setUseCaptureMode(mode)OCR_CAMERA_CAPTURE_MODEautoauto or manual

Fragment integration

res/layout/activity_main.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
class DocumentScanFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View = ComposeView(requireContext()).apply {
setContent {
DocumentScanScreen(sessionId = "YOUR_SESSION_ID")
}
}
}

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction()
.replace(R.id.main_container, DocumentScanFragment())
.commit()
}
}

Complete Activity example

This mirrors the real integration pattern used in the yes:id demo app — a three-state Activity (config screen → camera → results):

class OCRActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val sessionId = intent.getStringExtra("sessionId") ?: ""

setContent {
var result by remember { mutableStateOf<OCRResponse?>(null) }
var cameraActive by remember { mutableStateOf(false) }
val handled = remember { mutableStateOf(false) }

var ocrMode by remember { mutableStateOf(OCR_MODE.camera) }
var requireBackSide by remember { mutableStateOf(false) }

val config = remember {
OCRConfigurationBuilder
.setUserLicense("YOUR_LICENSE_KEY")
.setSessionID(sessionId)
}

when {
// ── Camera active ────────────────────────────────────────
cameraActive && result == null -> {
config
.setOCRMode(ocrMode)
.setRequireBackSide(requireBackSide)

YesidOCRCamera.OCRCamera(
configurationBuilder = config,
onResults = { r ->
if (!handled.value) {
handled.value = true
cameraActive = false
result = r
}
}
)
}

// ── Results ──────────────────────────────────────────────
result != null -> {
Column(Modifier.padding(16.dp)) {
Text("Document read", style = MaterialTheme.typography.headlineSmall)
Spacer(Modifier.height(12.dp))

result!!.documentText.forEach { (key, value) ->
Text("$key: $value", style = MaterialTheme.typography.bodyMedium)
}

Spacer(Modifier.height(16.dp))
Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) {
Button(onClick = { finish() }) { Text("Done") }
OutlinedButton(onClick = {
handled.value = false; result = null; cameraActive = false
}) { Text("Scan again") }
}
}
}

// ── Config screen ────────────────────────────────────────
else -> {
Column(Modifier.padding(16.dp)) {
Text("Scan ID document", style = MaterialTheme.typography.headlineSmall)
Spacer(Modifier.height(16.dp))

Row(verticalAlignment = Alignment.CenterVertically) {
Text("Double-sided", Modifier.weight(1f))
Switch(checked = requireBackSide, onCheckedChange = { requireBackSide = it })
}

Spacer(Modifier.height(16.dp))
Button(onClick = { handled.value = false; result = null; cameraActive = true }) {
Text("Start scan")
}
}
}
}
}
}
}