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 -> }
)
Gallery / upload mode
YesidOCRCamera.OCRCamera(
configurationBuilder = OCRConfigurationBuilder
.setSessionID(sessionId)
.setOCRMode(OCR_MODE.upload)
.setRequireBackSide(false),
onResults = { result -> }
)
Configuration reference
| Method | Type | Default | Description |
|---|---|---|---|
setSessionID(id) | String | — | Required. Session ID |
setOCRMode(mode) | OCR_MODE | camera | camera or upload |
setRequireBackSide(flag) | Boolean | false | Capture front and back |
setLensFacing(facing) | Int | LENS_FACING_BACK | Camera lens |
setUseCaptureMode(mode) | OCR_CAMERA_CAPTURE_MODE | auto | auto 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")
}
}
}
}
}
}
}