如何使用Accompanist正确申请粗略与精确定位权限?能否一次性申请?
如何用Accompanist一次性申请ACCESS_COARSE_LOCATION与ACCESS_FINE_LOCATION权限
当然可以一次性申请这两个定位权限,Accompanist配合Android的Activity Result API支持批量权限申请,只需对现有代码做以下调整:
1. 修改PermissionLauncher实现,支持批量权限申请
将原有的单权限申请逻辑替换为多权限申请的ActivityResultContracts.RequestMultiplePermissions():
@Composable fun rememberMultiplePermissionsLauncher( onPermissionsResult: (Map<String, Boolean>) -> Unit, ): PermissionLauncher { return PermissionLauncher( rememberLauncherForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissionsResult -> onPermissionsResult(permissionsResult) } ) } class PermissionLauncher( val launcher: ManagedActivityResultLauncher<Array<String>, Map<String, Boolean>> )
2. 调整权限申请代码,一次性传入两个定位权限
修改权限申请逻辑,同时传入两个定位权限,并处理每个权限的授予结果:
// 在Composable函数内的实际调用示例 val permissionsLauncher = rememberMultiplePermissionsLauncher { permissionsResult -> val isFineGranted = permissionsResult[Manifest.permission.ACCESS_FINE_LOCATION] ?: false val isCoarseGranted = permissionsResult[Manifest.permission.ACCESS_COARSE_LOCATION] ?: false when { isFineGranted -> { // 精确定位权限已授予,执行对应业务逻辑 } isCoarseGranted -> { // 仅粗略定位权限可用,执行降级处理逻辑 } else -> { // 两个权限均被拒绝,提示用户或引导至应用设置页 } } } // 触发权限申请(比如绑定到按钮点击事件) Button(onClick = { permissionsLauncher.launcher.launch( arrayOf( Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION ) ) }) { Text("申请定位权限") }
关键说明
- 你的AndroidManifest权限声明已经正确,无需修改
- Android 12+(API 31及以上)允许用户单独授予粗略或精确定位权限,因此需要分别处理两种授予状态
- 如果权限被永久拒绝(用户勾选了"不再询问"),可以通过
shouldShowRequestPermissionRationale判断,引导用户前往应用设置页手动开启权限
内容的提问来源于stack exchange,提问作者user21300258
相关产品推荐
相关产品推荐

