引言
目前 Jetpack Compose 的权限申请方面还不太成熟,官方推荐的做法是使用 accompanist ,但该库尚处于 Experimental 阶段,且使用起来也不简单。这里记录一下我自己发现的一种非常简单优雅的权限申请方法。
截图
源码
小提示:别忘了在Manifest文件中先声明权限,如果是Android10以上的话,还得在 Manifest 的 application 中添加属性
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:requestLegacyExternalStorage="true"
...>
<activity>
...
</activity>
</application>
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissions(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
) {
setContent {
if (it.isEmpty()) {
Main()
} else {
RequestFailed(permissions = it)
}
}
}
}
/**
* 请求权限,若用户拒绝,则将被拒绝的权限以回调形式返回
*
* @param permissions 要请求的权限
* @param onResult 将用户拒绝的权限返回
*
*/
private fun requestPermissions(vararg permissions: String, onResult: (List<String>) -> Unit) {
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->
val failed = result.filter { !it.value }.keys
onResult(failed.toList())
}.launch(arrayOf(*permissions))
}
}
@Composable
fun RequestFailed(permissions: List<String>) {
LazyColumn {
items(permissions) {
Text(text = "权限 $it 获取失败。")
}
}
}
@Composable
fun Main() {
Text(text = "权限申请成功!")
}