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

配置自getFilesDir()的FileProvider能否被其他应用正常访问?

错误原因说明

你遇到的报错和FileProvider跨应用能力无关,完全是使用逻辑错误导致的:
FileProvider.getUriForFile() 只能用于生成当前应用自身配置的FileProvider对应的Content Uri,且传入的File路径必须是当前应用可访问、且已在自身FileProvider路径配置中声明的目录。
你在应用B中传入了应用A的内部存储路径,还使用了仅在应用A中注册的FileProvider的authority,应用B本身没有对应Provider的配置,也无权直接访问应用A的私有目录,因此必然抛出找不到配置根路径的异常。

关于FileProvider跨应用能力的说明

FileProvider本身就是为跨应用共享私有文件设计的,并非仅支持单应用内使用,只是使用逻辑必须遵循规则:
谁是文件的所有者,谁负责配置FileProvider、生成Content Uri、为访问方授予权限。

你的需求实现方案

你当前的场景是应用B请求应用A处理应用A自身私有目录下的文件,完全不需要用到FileProvider,实现逻辑如下:

  1. 应用B仅需要发送携带业务参数的Intent即可,不需要操作文件路径或FileProvider:
try{
    Intent intent = new Intent("com.xxx.aaa.DO_SOMETHING_ON_TARGET");
    intent.setClassName("com.xxx.aaa","com.xxx.aaa.TargetActivity");
    // 如果需要传递动态文件名或其他参数,直接用putExtra传递
    intent.putExtra("target_file_name", "target.txt");
    context.startActivity(intent);
}catch(Exception e){
    Log.e(TAG, "start activity failed", e);
}
  1. 应用A在TargetActivity中接收Intent,自行读取自身私有目录下的文件即可,本身对自身私有目录有完全访问权限:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String fileName = getIntent().getStringExtra("target_file_name");
    File targetFile = new File(getFilesDir(), fileName);
    // 后续直接处理targetFile即可,不需要额外权限
}

补充:如果是应用B需要给应用A传递自身私有文件的场景

如果后续遇到B要把自己的文件传给A处理的需求,才需要用到跨应用FileProvider,正确逻辑为:

  • 应用B自己配置FileProvider,声明要共享的目录
  • 应用B调用FileProvider.getUriForFile()生成自身文件对应的Uri
  • 给Intent设置Uri和FLAG_GRANT_READ_URI_PERMISSION权限后发送给应用A
  • 应用A直接读取传入的Content Uri即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:36:00