Привет! Возьмите свой кофе ☕️ и давайте внедрим CameraX с помощью Jetpack Compose.

Зависимости

Откройте :app/build.gradle.kts и добавьте зависимости CameraX и Разрешения концертмейстера.

dependencies {
    // CameraX
    val cameraxVersion = "1.3.0-beta01"
    implementation("androidx.camera:camera-camera2:$cameraxVersion")
    implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
    implementation("androidx.camera:camera-view:$cameraxVersion")

    // Permissions
    implementation("com.google.accompanist:accompanist-permissions:0.31.3-beta")

    // Icons
    implementation("androidx.compose.material:material-icons-extended:1.4.3")
}

Управление разрешениями

Во-первых, давайте объявим их в AndroidManifest.xml.

<manifest>
    <!-- Add the permissions -->
    <uses-feature android:name="android.hardware.camera.any" />
    <uses-permission android:name="android.permission.CAMERA" />

    <application>...</application>
</manifest>

Теперь мы можем перейти к MainActivity.kt и обработать разрешения. Давайте начнем с создания переменной с именем cameraPermissions, которая будет обрабатывать необходимые разрешения для использования приложения.

val cameraPermission = rememberPermissionState(
    permissions = listOf(
        android.Manifest.permission.CAMERA
    )
)

Теперь давайте проверим, есть ли у пользователя все предоставленные разрешения, и если нет, мы предложим ему экран, который предложит ему предоставить разрешения на использование приложения.

if (!cameraPermission.status.isGranted) {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = "This permission is needed for this application")
        Button(
            onClick = { cameraPermissions.launchPermissionRequest() }
        ) {
            Text(text = "Grant")
        }
    }
} else {
    // ...
}

В блоке else у нас будет предварительный просмотр камеры и плавающая кнопка действия, которая сделает снимок.

Scaffold(
    modifier = Modifier.fillMaxSize(),
    floatingActionButton = {…