配置自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,实现逻辑如下:
- 应用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); }
- 应用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
相关产品推荐
相关产品推荐

