簡體   English   中英

如何在 Jetpack Compose 中請求權限?

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

我正在使用 Jetpack Compose 和 Kotlin 做一個應用程序。 這是一款定位 android 設備的應用程序。 我需要實現運行時權限以遵循 jetpack filosofy。 我有一個菜單頁面,其中有一個開關,激活時會保存設備的位置,但只需激活開關,就需要請求權限“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)
                        )

                    )
                }
            }

我想知道如何為此實現伴奏權限。

在 Compose 中,您可以使用 Google 的Accompanist 庫在運行時請求權限,只需使用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")
}

請求相機權限示例:

實施“com.google.accompanist:accompanist-permissions: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")
            }
        }
    }

}

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM