Skip to content

ismai117/KScan

Repository files navigation

License Latest release Latest build

KScan


Compose Multiplatform Barcode Scanning Library

Platform Android Platform iOS


Android iOS
android scanner 1 ios scanner 1

KScan is a Compose Multiplatform library that makes it easy to scan barcodes in your apps


To integrate KScan into your project

Add the dependency in your common module's commonMain source set


implementation("io.github.ismai117:KScan:0.1.0-beta08")

Android - MLKit

  • Uses Google’s MLKit library for barcode scanning on Android

iOS - AVFoundation

  • Utilizes Apple’s AVFoundation framework for camera setup and barcode scanning on iOS

Important: iOS requires you to add the "Privacy - Camera Usage Description" key to your Info.plist file inside xcode, you need to provide a reason for why you want to access the camera.

Basic Usage

To use KScan, simply add the ScannerView in your app like this:

if (showScanner) {
    ScannerView(
        codeTypes = listOf(
            BarcodeFormats.FORMAT_QR_CODE,
            BarcodeFormats.FORMAT_EAN_13,
        )
    ) { result ->
        when (result) {
            is BarcodeResult.OnSuccess -> {
                println("Barcode: ${result.barcode.data}, format: ${result.barcode.format}")
            }
            is BarcodeResult.OnFailed -> {
                println("error: ${result.exception.message}")
            }
            BarcodeResult.OnCanceled -> {
                println("scan canceled")
            }
        }
    }
}

To dismiss the scanner, you need to manage your own state, set it to false in the right places inside the ScannerView block after you handle the results

if (showScanner) {
    ScannerView(
        codeTypes = listOf(
            BarcodeFormats.FORMAT_QR_CODE,
            BarcodeFormats.FORMAT_EAN_13,
        )
    ) { result ->
        when (result) {
            is BarcodeResult.OnSuccess -> {
                println("Barcode: ${result.barcode.data}, format: ${result.barcode.format}")
                showScanner = false
            }
            is BarcodeResult.OnFailed -> {
                println("Error: ${result.exception.message}")
                showScanner = false
            }
            BarcodeResult.OnCanceled -> {
                showScanner = false
            }
        }
    }
}

If you want to remove the UI and just use the raw scanner, you can set the showUi parameter to false

if (showScanner) {
    ScannerView(
        codeTypes = listOf(
            BarcodeFormats.FORMAT_QR_CODE,
            BarcodeFormats.FORMAT_EAN_13,
        ),
        showUi = false
    ) { result ->
        when (result) {
            is BarcodeResult.OnSuccess -> {
                println("Barcode: ${result.barcode.data}, format: ${result.barcode.format}")
                showScanner = false
            }
            is BarcodeResult.OnFailed -> {
                println("Error: ${result.exception.message}")
                showScanner = false
            }
            BarcodeResult.OnCanceled -> {
                showScanner = false
            }
        }
    }
}

To build a custom scanner UI with torch and zoom control, set showUi = false and use a ScannerController.

val scannerController = remember { ScannerController() }

if (showScanner) {
    ScannerView(
        codeTypes = listOf(BarcodeFormat.FORMAT_ALL_FORMATS),
        showUi = false,
        scannerController = scannerController
    ) { result ->
        when (result) {
            is BarcodeResult.OnSuccess -> {
                println("Barcode: ${result.barcode.data}, format: ${result.barcode.format}")
                showScanner = false
            }
            is BarcodeResult.OnFailed -> {
                println("Error: ${result.exception.message}")
                showScanner = false
            }
            BarcodeResult.OnCanceled -> {
                showScanner = false
            }
        }
    }

    Column(
        modifier = Modifier.align(Alignment.BottomCenter).padding(16.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(onClick = {
            scannerController.setTorch(!scannerController.torchEnabled)
        }) {
            Text("Torch ${if (scannerController.torchEnabled) "Off" else "On"}")
        }
        Slider(
            value = scannerController.zoomRatio,
            onValueChange = scannerController::setZoom,
            valueRange = 1f..scannerController.maxZoomRatio
        )
    }
}

About

Compose Multiplatform Barcode Scanning

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages