Tema
/
Mobiliosios programėlės KOTLIN
Pamoka 11 / 14 QR skenavimas ~45 min

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, checkSelfPermission grąžins DENIED, o peržiūra bus juoda — jokios klaidos, jokio dialogo, tiesiog tamsu. Todėl ScanScreen pirmiausia tikrina leidimą ir, jei jo nėra, LaunchedEffect paleidžia dialogą. Nepamiršk: manifestas + vykdymo prašymas — abu būtini.