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

Android 13下FileProvider权限异常:授临时权限仍无法访问文件描述符

Android 13 下 FileProvider 广播传递 URI 权限失效问题解决

问题原因

Android 13 对 URI 权限授予逻辑做了严格限制,当通过广播传递 FileProvider URI 时:

  1. 若发送隐式广播(未指定目标包名/组件),系统会限制 URI 权限的传递,即便调用 grantUriPermission,目标应用也无法正确获取权限。
  2. 混合使用 grantUriPermission 和 Intent 权限标记,可能导致权限规则冲突,最终权限未生效。

解决方案

1. 使用显式广播指定目标应用

发送广播前通过 setPackage 明确指定 App B 的包名,确保 Intent 仅传递给目标应用,让系统能正确关联权限授予:

val fileUri = FileProvider.getUriForFile(context, "app.a.package.fileprovider", someFile)
if (fileUri != null) {
    val resultIntent = Intent("YOUR_BROADCAST_ACTION")
    // 显式指定目标包名,必须与App B的包名完全一致
    resultIntent.setPackage("app.b.package")
    resultIntent.putExtra(FILE_URI_EXTRA, fileUri)

    // 仅保留显式权限授予,移除Intent的权限标记(避免冲突)
    context.grantUriPermission(
        "app.b.package",
        fileUri,
        Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
    )

    context.sendBroadcast(resultIntent)
}

2. 确认 FileProvider 配置正确性

检查 App A 的 AndroidManifest 中 FileProvider 配置,确保 android:grantUriPermissions="true" 已开启:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="app.a.package.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"/>
</provider>

同时确认 res/xml/file_paths.xml 已正确配置文件路径(以访问 files 目录为例):

<paths>
    <files-path name="internal_files" path="."/>
</paths>

3. 可选:手动回收权限

在 App B 完成文件操作后,手动回收 URI 权限避免权限泄漏:

Uri fileUri = intent.getParcelableExtra(FILE_URI_EXTRA);
if (fileUri == null) return;
try {
    ParcelFileDescriptor inputPFD = context.getContentResolver().openFileDescriptor(fileUri, "rw");
    if (inputPFD == null) return;
    FileDescriptor licenseFileFD = inputPFD.getFileDescriptor();
    // 执行文件读写操作...
} catch (Exception e) {
    e.printStackTrace();
} finally {
    // 回收已授予的权限
    context.revokeUriPermission(fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}

验证要点

  • 确保 App A 和 App B 的 targetSdkVersion 均为 33 及以上,适配 Android 13 权限规则。
  • App B 的 BroadcastReceiver 配置:若使用显式广播,android:exported 可设为 false;若为隐式广播则需设为 true(推荐优先使用显式广播)。

内容的提问来源于stack exchange,提问作者jimmy_sprinkles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:35:15