简体   繁体   English

如何在 Jetpack Compose 中请求权限?

[英]How can I request permissions in Jetpack Compose?

I'm doing an application with Jetpack Compose and Kotlin.我正在使用 Jetpack Compose 和 Kotlin 做一个应用程序。 It is an app to locate an android device.这是一款定位 android 设备的应用程序。 I need to implement run time permissions to follow the jetpack filosofy.我需要实现运行时权限以遵循 jetpack filosofy。 I have a menu page where there is a switch that when is activate saves the location of the device but just activate the switch it is necessary to request permissions "fine_location", "coarse_location" and "back_groundlocation".我有一个菜单页面,其中有一个开关,激活时会保存设备的位置,但只需激活开关,就需要请求权限“fine_location”、“coarse_location”和“back_groundlocation”。 This is my menu.kt code:这是我的 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)
                        )

                    )
                }
            }

I'd want to know how can I implement accompanist permissions for this.我想知道如何为此实现伴奏权限。

In Compose you can use Google's Accompanist library to request permission at runtime, just with PermissionRequired .在 Compose 中,您可以使用 Google 的Accompanist 库在运行时请求权限,只需使用PermissionRequired即可。
This is an example with camera permission but you can request any permissions you have in your manifest file as android.Manifest.permission.*这是一个带有摄像头权限的示例,但您可以请求您在清单文件中拥有的任何权限,例如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")
}

Request camera permission sample:请求相机权限示例:

implementation "com.google.accompanist:accompanist-permissions:0.20.0"实施“com.google.accompanist:accompanist-permissions:0.20.0”

The permission APIs are currently experimental and they could change at any time.权限 API 目前处于试验阶段,可能随时更改。 All of the APIs are marked with the @ExperimentalPermissionsApi annotation.所有 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")
            }
        }
    }

}

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM