qr scanner
This commit is contained in:
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user