Sukurk ScanScreen.kt — CameraX + ML Kit
Kodo stulpelyje — ScanScreen.kt. Trys dalys: (1) kameros leidimo prašymas vykdymo metu, (2) CameraX peržiūra per AndroidView, (3) MlKitAnalyzer, kuris grąžina nuskaitytą QR ir iškviečia onTableScanned(value) — vieną kartą (scanned vėliava). (Tikrasis ekranas dar turi dekoratyvų instrukcijų perdangą — praleista, kad matytųsi mechanika.)
Reikia trijų aplinkos dalykų.
1. Leidimai ir deps AndroidManifest.xml + build.gradle.kts:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
implementation(libs.androidx.camera.view)
implementation(libs.androidx.camera.mlkit.vision)
implementation(libs.mlkit.barcode.scanning)
2. Navigacija — naujas Screen.Scan (4 pamokos Nav3), o nuskaitęs staliuką — nuvedam į meniu:
@Serializable data object Scan : Screen()
entry<Screen.Scan> {
ScanScreen(onTableScanned = { raw ->
tableSession.setTable(raw)
backStack.add(Screen.Menu) // nuskenavai → į meniu
})
}
3. Startas nuo skenavimo. Prisijungusį (bet dar nenuskenavusį) vartotoją gali nukreipti į Scan — taip užsakymas visada turės staliuką.
Patikrink. Sugeneruok testinį QR su tekstu table:7 (bet koks internetinis QR generatorius), paleisk programėlę tikrame telefone (emuliatoriaus kamera QR nemato gerai):
1. Atidarai Scan → dialogas prašo kameros leidimo → leidi.
2. Nukreipi kamerą į QR → ekranas peršoka į meniu, TableSession = "7".
3. Užsakai → POST /orders su "table_number": "7".
Spąstai (leidimas). Kamera — vykdymo meto leidimas. Jei tik įrašysi jį manifeste ir NEpaprašysi per
rememberLauncherForActivityResult,checkSelfPermissiongrąžinsDENIED, o peržiūra bus juoda — jokios klaidos, jokio dialogo, tiesiog tamsu. TodėlScanScreenpirmiausia tikrina leidimą ir, jei jo nėra,LaunchedEffectpaleidžia dialogą. Nepamiršk: manifestas + vykdymo prašymas — abu būtini.