![](/img/trans.png)
[英]How to handle runtime permissions in jetpack compose properly by accompanist?
[英]Jetpack Compose with Accompanist Permissions to access local files
我想使用我放在 libs 目录中的密钥库文件。 我在AndroidManifest.xl
中添加了权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-sdk tools:overrideLibrary="com.github.dhaval2404.colorpicker,com.datacap.device_connection" />
<uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS"/>
我在运行时请求了权限,并以这种方式使用Accompanist Permissions
:
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun PermissionsRequest(
permissions: List<String>,
deniedMessage: String,
rationaleMessage: String
) {
val multiplePermissionsState = rememberMultiplePermissionsState(permissions = permissions)
HandelRequest(
multiplePermissionsState = multiplePermissionsState,
deniedContent = { shouldShowRationale ->
PermissionDeniedContent(
deniedMessage = deniedMessage,
rationaleMessage = rationaleMessage,
shouldShowRationale = shouldShowRationale,
onRequestPermission = { multiplePermissionsState.launchMultiplePermissionRequest() }
)
},
content = {}
)
}
@Composable
fun Content(text: String, showButton: Boolean = true, onClick: () -> Unit) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(50.dp)
.background(color = Color.Gray),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = text, textAlign = TextAlign.Center)
Spacer(modifier = Modifier.height(12.dp))
if (showButton) {
Button(onClick = onClick) {
Text(text = "Give Permission")
}
}
}
}
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun HandelRequest(
multiplePermissionsState: MultiplePermissionsState,
deniedContent: @Composable (Boolean) -> Unit,
content: @Composable () -> Unit
) {
var shouldShowRationale by remember { mutableStateOf(false) }
val result = multiplePermissionsState.permissions.all {
shouldShowRationale = it.status.shouldShowRationale
it.status == PermissionStatus.Granted
}
if (!result) deniedContent(shouldShowRationale)
}
@ExperimentalPermissionsApi
@Composable
fun PermissionDeniedContent(
deniedMessage: String,
rationaleMessage: String,
shouldShowRationale: Boolean,
onRequestPermission: () -> Unit
) {
if (shouldShowRationale) {
AlertDialog(
onDismissRequest = {},
title = {
Text(
text = "Permission Request",
style = TextStyle(
fontSize = MaterialTheme.typography.h6.fontSize,
fontWeight = FontWeight.Bold
)
)
},
text = {
Text(rationaleMessage)
},
confirmButton = {
Button(onClick = onRequestPermission) {
Text("Give Permission")
}
}
)
} else {
Content(text = deniedMessage, onClick = onRequestPermission)
}
}
我要求获得这些权限:
val PERMISSIONS_LIST = listOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
在应用程序第一次运行时,我得到了权限请求,我给了它一个访问权限,第一个是使用相机和录制视频,第二个是访问照片和媒体内容。
但我仍然一次又一次地遇到同样的错误:
失败,异常:java.io.FileNotFoundException:app/libs/keystore/keypos.jks:打开失败:ENOENT(没有这样的文件或目录)
如何解决这个问题? 由于这个问题,我无法使用 ssl 设置。
似乎可以通过其他方式从应用程序 package 读取本地文件。
我将密钥库放在res
目录中,在它自己的目录中。 并使用上下文来获取它。
val file = context?.resources?.openRawResource(R.raw.keypos)
就是这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.