Как я могу запросить разрешения в Jetpack Compose?

#kotlin #permissions #android-jetpack-compose #runtime-permissions

#Android #kotlin #разрешения #android-jetpack-compose #время выполнения-разрешения

Вопрос:

Я делаю приложение с Jetpack Compose и Kotlin. Это приложение для определения местоположения устройства Android. Мне нужно реализовать разрешения во время выполнения, чтобы следовать философии jetpack. У меня есть страница меню, где есть переключатель, который при активации сохраняет местоположение устройства, но просто активируйте переключатель, необходимо запросить разрешения «fine_location», «coarse_location» и «back_groundlocation». Это мой код menu.kt:

 LazyColumn {
        item {

            Row {
                Box(
                    modifier =
                    Modifier.fillMaxWidth(0.8f)
                )
                {
                    Text(
                        color = Color.Black,
                        text = stringResource(R.string.location_gps),
                        fontSize = 30.sp,
                        modifier = Modifier.padding(20.dp)
                    )

                }
                Box(
                    modifier =
                    Modifier.fillMaxSize(),
                    contentAlignment = Alignment.CenterEnd
                ) {
                    Switch(
                        checked = checkedStateGps.value,
                        onCheckedChange = { checkedStateGps.value = it },
                        modifier = Modifier
                            .padding(20.dp),
                        colors= SwitchDefaults.colors(
                            //color of switches
                            checkedThumbColor = Color(0xFF00CC99),
                            checkedTrackColor = Color(0xFF7BB661),
                            uncheckedThumbColor = Color(0xFF83010B),
                            uncheckedTrackColor = Color(0xFFBB4C4C)
                        )

                    )
                }
            }
 

Я хотел бы знать, как я могу реализовать разрешения аккомпаниатора для этого.

Комментарии:

1. ссылка на ссылку: google.github.io/accompanist/permissions

Ответ №1:

В Compose вы можете использовать библиотеку Accompanist от Google для запроса разрешений во время выполнения, просто с PermissionRequired помощью .
Это пример с разрешением камеры, но вы можете запросить любые разрешения, которые у вас есть в файле манифеста, как android.Manifest.permission.*

 var doNotShowRationale by rememberSaveable { mutableStateOf(false) }
val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
PermissionRequired(
    permissionState = cameraPermissionState,
    permissionNotGrantedContent = {
        if (doNotShowRationale) {
            Text("Feature not available")
        } else {
            Column {
                Text("The camera is important for this app. Please grant the permission.")
                Spacer(modifier = Modifier.height(8.dp))
                Row {
                    Button(onClick = { cameraPermissionState.launchPermissionRequest() }) {
                        Text("Ok!")
                    }
                    Spacer(Modifier.width(8.dp))
                    Button(onClick = { doNotShowRationale = true }) {
                        Text("Nope")
                    }
                }
            }
        }
    },
    permissionNotAvailableContent = {
        Column {
            Text(
                "Camera permission denied. See this FAQ with information about why we "  
                    "need this permission. Please, grant us access on the Settings screen."
            )
            Spacer(modifier = Modifier.height(8.dp))
            Button(onClick = navigateToSettingsScreen) {
                Text("Open Settings")
            }
        }
    }
) {
    Text("Camera permission Granted")
}
 

Комментарии:

1. я пытаюсь реализовать этот код, но разрешения не отображаются при активации переключателя.

Ответ №2:

Образец запроса разрешения камеры:

реализация «com.google.accompanist: accompanist-разрешения: 0.20.0»

API-интерфейсы разрешений в настоящее время являются экспериментальными и могут быть изменены в любое время. Все API отмечены аннотацией @ExperimentalPermissionsApi.

 import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionRequired
import com.google.accompanist.permissions.rememberPermissionState
import pe.edu.upc.permissionscompose.ui.theme.PermissionsComposeTheme
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PermissionsComposeTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    FeatureThatRequiresCameraPermission()
                }
            }
        }
    }
}


@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun FeatureThatRequiresCameraPermission() {
    var doNotShowRationale by rememberSaveable {
        mutableStateOf(false)
    }

    val cameraPermissionState =
        rememberPermissionState(permission = android.Manifest.permission.CAMERA)

    val context = LocalContext.current

    PermissionRequired(
        permissionState = cameraPermissionState,
        permissionNotGrantedContent = {
            if (doNotShowRationale) {
                Text("Feature not available")
            } else {
                PermissionNotGrantedUI(
                    onYesClick = {
                        cameraPermissionState.launchPermissionRequest()
                    }, onCancelClick = {
                        doNotShowRationale = true
                    })
            }
        },
        permissionNotAvailableContent = {
            PermissionNotAvailableContent(
                onOpenSettingsClick = { context.openSettings() })
        },
        content = {
            Text("Camera Permission Granted")
        }
    )


}

@Composable
fun PermissionNotAvailableContent(onOpenSettingsClick: () -> Unit) {

    Column {
        Text("Camera permission denied.")
        Spacer(modifier = Modifier.height(8.dp))
        Button(onClick = { onOpenSettingsClick() }) {
            Text("Open settings")
        }
    }
}


@Composable
fun PermissionNotGrantedUI(onYesClick: () -> Unit, onCancelClick: () -> Unit) {
    Column {
        Text("Camera is important for this app. Please grant ther permission.")
        Spacer(modifier = Modifier.height(8.dp))
        Row {
            Button(onClick = {
                onYesClick()
            }) {
                Text("Yes")
            }
            Spacer(modifier = Modifier.width(8.dp))
            Button(onClick = {
                onCancelClick()
            }) {
                Text("Cancel")
            }
        }
    }

}
 

введите описание изображения здесь