Android 13存储权限异常:无法获取PDF文件URI
解决Android 13上SAF文件选择器回调无响应的问题
1. 修正启动器变量名拼写错误
你的代码存在大小写不一致的问题:
- 定义的启动器变量是
signlauncher(小写s开头) - 调用时用的是
signLauncher.launch(intent)(大写L开头)
Kotlin是大小写敏感语言,这会导致实际调用的启动器与注册的实例不匹配,直接造成回调无法触发。修正后代码如下:
// 统一变量名大小写 private val signLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> when (result.resultCode) { Activity.RESULT_OK -> { result.data?.data?.let { uri -> // 处理选中的PDF文件URI } } Activity.RESULT_CANCELED -> { // 处理用户取消操作的逻辑 } } } fun openFilePicker() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.type = "application/pdf" intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) // 调用正确的启动器实例 signLauncher.launch(intent) }
2. 移除不必要的权限声明
Android 13及以上版本,使用存储访问框架(SAF)的ACTION_OPEN_DOCUMENT无需申请READ_EXTERNAL_STORAGE权限,多余的权限声明可能引发权限逻辑冲突,干扰回调流程。请从AndroidManifest.xml中移除该权限:
<!-- 移除该行权限声明 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3. 添加URI权限标记
在创建Intent时,添加FLAG_GRANT_READ_URI_PERMISSION确保应用能读取返回的PDF文件URI,虽然这不是回调无响应的直接原因,但可避免后续文件读取失败:
fun openFilePicker() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.type = "application/pdf" intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) // 添加临时读取权限标记 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) signLauncher.launch(intent) }
4. 确认启动器注册时机
确保registerForActivityResult在Activity/Fragment的onCreate方法或更早时机完成注册,不要在点击事件等动态时机注册,否则启动器无法正确绑定生命周期,导致回调不触发。
内容的提问来源于stack exchange,提问作者Aytaj
相关产品推荐
相关产品推荐

