Fragment中registerForActivityResult请求多权限无等待直接返回结果
解决Fragment中registerForActivityResult请求权限直接返回结果的问题
可能的原因及对应解决办法
1. 权限已被提前授予
如果目标权限之前已经被用户允许过,系统会直接返回授权结果,不会再弹出请求弹窗。可以先检查权限状态,再决定是否发起请求:
private fun requireExternalPermission() { val hasReadPerm = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED val hasWritePerm = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED if (!hasReadPerm || !hasWritePerm) { val arrayPermission = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ) mediaLauncher.launch(arrayPermission) } else { Log.d("log", "权限已提前授予,无需再次请求") // 直接执行权限通过后的逻辑 } }
2. registerForActivityResult初始化时机不对
registerForActivityResult必须在Fragment的生命周期早期初始化(比如onCreate方法中),不能在懒加载、点击事件或其他晚生命周期阶段初始化,否则会因为生命周期不匹配导致系统直接返回默认结果。
修正后的初始化代码:
private lateinit var mediaLauncher: ActivityResultLauncher<Array<String>> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mediaLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> Log.d("log", "permissions: $permissions") // 在这里处理权限回调结果 } } private fun requireExternalPermission() { val arrayPermission = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ) mediaLauncher.launch(arrayPermission) }
3. Android 13+ 外部存储权限废弃
从Android 13(API 33)开始,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE被废弃,系统不再弹窗请求这两个权限,直接返回授权结果。需要根据系统版本适配新的媒体权限:
private fun requireMediaPermission() { val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ 使用细分媒体权限 arrayOf( Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO // 按需添加READ_MEDIA_AUDIO等权限 ) } else { // 低版本使用旧存储权限 arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ) } mediaLauncher.launch(permissions) }
内容的提问来源于stack exchange,提问作者DucK
相关产品推荐
相关产品推荐

