You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:45:09