From 42ac1fc8c4c4eb5bc54760939828833ca8569407 Mon Sep 17 00:00:00 2001 From: sathwikcs <85106054+sathwikcs@users.noreply.github.com> Date: Wed, 16 Oct 2024 17:45:56 +0530 Subject: [PATCH] qr scanner --- .../screens/home/ui/componets/QRscreen.kt | 26 +----- .../screens/home/ui/componets/Qrscanner.kt | 91 ++++++++++--------- 2 files changed, 51 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/QRscreen.kt b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/QRscreen.kt index 5c683e5..1524112 100644 --- a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/QRscreen.kt +++ b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/QRscreen.kt @@ -12,13 +12,12 @@ import androidx.compose.ui.unit.dp import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.shouldShowRationale @Composable fun DefaultScreen( qrCodeValue: String?, - onScanClick: () -> Unit, - onRetryClick: () -> Unit ) { Column( modifier = Modifier @@ -30,27 +29,8 @@ fun DefaultScreen( qrCodeValue?.let { Text(text = "Scanned Value: $it", modifier = Modifier.padding(16.dp)) } - Button(onClick = if (qrCodeValue == null) onScanClick else onRetryClick) { - Text(if (qrCodeValue == null) "Scan" else "Retry") - } } } -@OptIn(ExperimentalPermissionsApi::class) -@Composable -fun RequestPermissions( - cameraPermissionState: PermissionState, - locationPermissionState: PermissionState -) { - val context = LocalContext.current - LaunchedEffect(Unit) { - cameraPermissionState.launchPermissionRequest() - locationPermissionState.launchPermissionRequest() - } - if (!cameraPermissionState.status.isGranted) { - Toast.makeText(context, "Camera permission is required", Toast.LENGTH_LONG).show() - } - if (!locationPermissionState.status.isGranted) { - Toast.makeText(context, "Location permission is required", Toast.LENGTH_LONG).show() - } -} + + diff --git a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Qrscanner.kt b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Qrscanner.kt index 178582f..97d36d7 100644 --- a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Qrscanner.kt +++ b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Qrscanner.kt @@ -6,10 +6,12 @@ import androidx.camera.core.* import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.view.PreviewView import androidx.compose.foundation.layout.* +import androidx.compose.material3.OutlinedCard import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleOwner @@ -18,59 +20,62 @@ import com.google.mlkit.vision.barcode.BarcodeScanning import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.common.InputImage -@SuppressLint("UnsafeOptInUsageError") @Composable fun QRCodeScannerScreen( onQRCodeScanned: (String) -> Unit, - lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current + lifecycleOwner: LifecycleOwner = androidx.lifecycle.compose.LocalLifecycleOwner.current ) { - val context = LocalContext.current - val previewView = remember { PreviewView(context) } + OutlinedCard( + modifier = Modifier.padding(10.dp) + ) { + val context = LocalContext.current + val previewView = remember { PreviewView(context) } - LaunchedEffect(Unit) { - val cameraProviderFuture = ProcessCameraProvider.getInstance(context) - val cameraProvider = cameraProviderFuture.get() + LaunchedEffect(Unit) { + val cameraProviderFuture = ProcessCameraProvider.getInstance(context) + val cameraProvider = cameraProviderFuture.get() - val preview = Preview.Builder().build().apply { - setSurfaceProvider(previewView.surfaceProvider) - } - - val barcodeScanner = BarcodeScanning.getClient( - BarcodeScannerOptions.Builder() - .setBarcodeFormats(Barcode.FORMAT_QR_CODE) - .build() - ) - - val imageAnalyzer = ImageAnalysis.Builder() - .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) - .build() - .also { analyzer -> - analyzer.setAnalyzer(ContextCompat.getMainExecutor(context)) { imageProxy -> - processImageProxy(imageProxy, barcodeScanner) { value -> - onQRCodeScanned(value) - } - } + val preview = Preview.Builder().build().apply { + setSurfaceProvider(previewView.surfaceProvider) } - try { - cameraProvider.unbindAll() - cameraProvider.bindToLifecycle( - lifecycleOwner, - CameraSelector.DEFAULT_BACK_CAMERA, - preview, - imageAnalyzer + val barcodeScanner = BarcodeScanning.getClient( + BarcodeScannerOptions.Builder() + .setBarcodeFormats(Barcode.FORMAT_QR_CODE) + .build() ) - } catch (e: Exception) { - Log.e("QRCodeScanner", "Camera binding failed", e) - } - } - AndroidView( - modifier = Modifier - .fillMaxWidth() - .aspectRatio(1f), - factory = { previewView } - ) + val imageAnalyzer = ImageAnalysis.Builder() + .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) + .build() + .also { analyzer -> + analyzer.setAnalyzer(ContextCompat.getMainExecutor(context)) { imageProxy -> + processImageProxy(imageProxy, barcodeScanner) { value -> + onQRCodeScanned(value) + } + } + } + + try { + cameraProvider.unbindAll() + cameraProvider.bindToLifecycle( + lifecycleOwner, + CameraSelector.DEFAULT_BACK_CAMERA, + preview, + imageAnalyzer + ) + } catch (e: Exception) { + Log.e("QRCodeScanner", "Camera binding failed", e) + } + } + + AndroidView( + modifier = Modifier + .fillMaxWidth() + .aspectRatio(1f), + factory = { previewView } + ) + } } @SuppressLint("UnsafeOptInUsageError")