/
ursa
/
AndroidMultimedia
Обзор
Документация
Войти
/
ursa
/
AndroidMultimedia
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
app/src/main/java/com/devshish/multimedia/camera/CameraXCapture.kt
80 строк
3 KB
ursa
add project
03 мар 2025, 11:45
03 мар 2025, 11:45
ffdd6d7
Код
Авторство
О чём код?
package com.devshish.multimedia.camera import androidx.camera.compose.CameraXViewfinder import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.viewModelFactory import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.shouldShowRationale @OptIn(ExperimentalPermissionsApi::class) @Composable fun CameraPreviewScreen() { val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA) if (cameraPermissionState.status.isGranted) { CameraPreviewContent() } else { Column( modifier = Modifier.fillMaxSize().wrapContentSize().widthIn(max = 480.dp), horizontalAlignment = Alignment.CenterHorizontally ) { val textToShow = if (cameraPermissionState.status.shouldShowRationale) { // If the user has denied the permission but the rationale can be shown, // then gently explain why the app requires this permission "Whoops! Looks like we need your camera to work our magic!" + "Don't worry, we just wanna see your pretty face (and maybe some cats). " + "Grant us permission and let's get this party started!" } else { // If it's the first time the user lands on this feature, or the user // doesn't want to be asked again for this permission, explain that the // permission is required "Hi there! We need your camera to work our magic! ✨\n" + "Grant us permission and let's get this party started! \uD83C\uDF89" } Text(textToShow, textAlign = TextAlign.Center) Spacer(Modifier.height(16.dp)) Button(onClick = { cameraPermissionState.launchPermissionRequest() }) { Text("Unleash the Camera!") } } } } @Composable fun CameraPreviewContent( viewModel: CameraPreviewViewModel = viewModel(), modifier: Modifier = Modifier, lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current ) { val surfaceRequest = viewModel.surfaceRequest.collectAsStateWithLifecycle() val context = LocalContext.current LaunchedEffect(lifecycleOwner) { viewModel.bindToCamera(context.applicationContext, lifecycleOwner) } surfaceRequest.value?.let { request -> CameraXViewfinder( surfaceRequest = request, modifier = modifier ) } }