QRKit is a Kotlin Multiplatform library for Qr Scan in your Android or iOS App.
Installation
Add the dependency to your build.gradle.kts
file:
commonMain.dependencies {
implementation("network.chaintech:qr-kit:1.0.2")
}
QrScanner :- Add Permissions in Android and iOS
- Android : Include this at root level in your AndroidManifest.xml:
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
- iOS : Add below key to the Info.plist in your xcode project:
<key>NSCameraUsageDescription</key><string>$(PRODUCT_NAME) camera description.</string>
<key>NSPhotoLibraryUsageDescription</key><string>$(PRODUCT_NAME)photos description.</string>
Example
QrScanner(
modifier: Modifier,
flashlightOn: Boolean,
launchGallery: Boolean,
onCompletion: (String) -> Unit,
onGalleryCallBackHandler: (Boolean) -> Unit,
onFailure: (String) -> Unit
)
-
modifier
: Modifier for modifying the layout of the QR scanner. -
flashlightOn
: Boolean indicating whether the flashlight is turned on. -
launchGallery
: Boolean indicating whether to launch the gallery for selecting images. -
onCompletion
: Callback invoked when a QR code is successfully scanned. -
onGalleryCallBackHandler
: Callback invoked to indicate the status of the gallery, whether it's open or closed. -
onFailure
: Callback invoked when there's a failure during QR code scanning.
Usage
@Composable
fun QrScannerCompose() {
var qrCodeURL by remember { mutableStateOf("") }
var startBarCodeScan by remember { mutableStateOf(false) }
var flashlightOn by remember { mutableStateOf(false) }
var launchGallery by remember { mutableStateOf(value = false) }
val snackBarHostState = LocalSnackBarHostState.current
val coroutineScope = rememberCoroutineScope()
Box(modifier = Modifier.fillMaxSize().statusBarsPadding()) {
Column(
modifier = Modifier
.background(color = Color.White)
.windowInsetsPadding(WindowInsets.safeDrawing)
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
if (qrCodeURL.isEmpty() && startBarCodeScan) {
Column(
modifier = Modifier
.background(color = Color.Black)
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Box(
modifier = Modifier
.size(250.dp)
.clip(shape = RoundedCornerShape(size = 14.dp))
.clipToBounds()
.border(2.dp, Color.Gray, RoundedCornerShape(size = 14.dp)),
contentAlignment = Alignment.Center
) {
QrScanner(
modifier = Modifier
.clipToBounds()
.clip(shape = RoundedCornerShape(size = 14.dp)),
flashlightOn = flashlightOn,
launchGallery = launchGallery,
onCompletion = {
qrCodeURL = it
startBarCodeScan = false
},
onGalleryCallBackHandler = {
launchGallery = it
},
onFailure = {
coroutineScope.launch {
if (it.isEmpty()) {
snackBarHostState.showSnackbar("Invalid qr code")
} else {
snackBarHostState.showSnackbar(it)
}
}
}
)
}
Box(
modifier = Modifier
.padding(start = 20.dp, end = 20.dp, top = 30.dp)
.background(
color = Color(0xFFF9F9F9),
shape = RoundedCornerShape(25.dp)
)
.height(35.dp),
contentAlignment = Alignment.Center
) {
Row(
modifier = Modifier
.padding(vertical = 5.dp, horizontal = 18.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(11.dp)
) {
Icon(imageVector = if (flashlightOn) Icons.Filled.FlashOn else Icons.Filled.FlashOff,
"flash",
modifier = Modifier
.size(24.dp)
.clickable {
flashlightOn = !flashlightOn
})
VerticalDivider(
modifier = Modifier,
thickness = 1.dp,
color = Color(0xFFD8D8D8)
)
Image(
painter = painterResource(Res.drawable.ic_gallery_icon),
contentDescription = "gallery",
contentScale = ContentScale.Fit,
modifier = Modifier
.size(24.dp)
.clickable {
launchGallery = true
}
)
}
}
}
} else {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Button(
onClick = {
startBarCodeScan = true
qrCodeURL = ""
},
colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF007AFF)),
) {
Text(
text = "Scan Qr",
modifier = Modifier.background(Color.Transparent)
.padding(horizontal = 12.dp, vertical = 12.dp),
fontSize = 16.sp
)
}
Text(
text = qrCodeURL,
color = Color.Black,
modifier = Modifier.padding(top = 12.dp)
)
}
}
}
if (startBarCodeScan) {
Icon(
imageVector = Icons.Filled.Close,
"Close",
modifier = Modifier
.padding(top = 12.dp, end = 12.dp)
.size(24.dp)
.clickable {
startBarCodeScan = false
}.align(Alignment.TopEnd),
tint = Color.White
)
}
}
}
Tech Stack
- Compose Multiplatform
- CameraX Jetpack library
- ML Kit
Conclusion
Integrating a QR code scanner library enhances functionality, streamlines processes, and improves user experience in your application.
https://github.com/ChainTechNetwork/QRKitComposeMultiplatform.git
Happy coding ❤
Connect with us 👇
Top comments (0)