qr scanner

This commit is contained in:
sathwikcs
2024-10-16 17:45:56 +05:30
parent dcee750197
commit 42ac1fc8c4
2 changed files with 51 additions and 66 deletions

View File

@@ -12,13 +12,12 @@ import androidx.compose.ui.unit.dp
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.PermissionState
import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.shouldShowRationale
@Composable @Composable
fun DefaultScreen( fun DefaultScreen(
qrCodeValue: String?, qrCodeValue: String?,
onScanClick: () -> Unit,
onRetryClick: () -> Unit
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
@@ -30,27 +29,8 @@ fun DefaultScreen(
qrCodeValue?.let { qrCodeValue?.let {
Text(text = "Scanned Value: $it", modifier = Modifier.padding(16.dp)) 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()
}
}

View File

@@ -6,10 +6,12 @@ import androidx.camera.core.*
import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.OutlinedCard
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner 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.barcode.common.Barcode
import com.google.mlkit.vision.common.InputImage import com.google.mlkit.vision.common.InputImage
@SuppressLint("UnsafeOptInUsageError")
@Composable @Composable
fun QRCodeScannerScreen( fun QRCodeScannerScreen(
onQRCodeScanned: (String) -> Unit, onQRCodeScanned: (String) -> Unit,
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current lifecycleOwner: LifecycleOwner = androidx.lifecycle.compose.LocalLifecycleOwner.current
) { ) {
val context = LocalContext.current OutlinedCard(
val previewView = remember { PreviewView(context) } modifier = Modifier.padding(10.dp)
) {
val context = LocalContext.current
val previewView = remember { PreviewView(context) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
val cameraProviderFuture = ProcessCameraProvider.getInstance(context) val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
val cameraProvider = cameraProviderFuture.get() val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build().apply { val preview = Preview.Builder().build().apply {
setSurfaceProvider(previewView.surfaceProvider) 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)
}
}
} }
try { val barcodeScanner = BarcodeScanning.getClient(
cameraProvider.unbindAll() BarcodeScannerOptions.Builder()
cameraProvider.bindToLifecycle( .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
lifecycleOwner, .build()
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageAnalyzer
) )
} catch (e: Exception) {
Log.e("QRCodeScanner", "Camera binding failed", e)
}
}
AndroidView( val imageAnalyzer = ImageAnalysis.Builder()
modifier = Modifier .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.fillMaxWidth() .build()
.aspectRatio(1f), .also { analyzer ->
factory = { previewView } 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") @SuppressLint("UnsafeOptInUsageError")