求助:FileProvider提供器路径无法指向assets文件夹问题
解决 "FileProvider provider path cannot point to assets folder" 错误
嗨,这个问题我帮不少开发者排查过,根源其实很清晰:FileProvider从设计上就不支持直接映射assets目录。assets是打包进APK的只读资源,不属于设备文件系统里的可访问路径,所以只要你在provider_paths.xml里配置了<assets>相关节点,就会触发这个报错。
具体修复步骤
检查并修正
provider_paths.xml
FileProvider仅支持以下几种合法路径类型,你要确保配置里只保留这些内容:<files-path>:对应App内部的getFilesDir()目录<external-files-path>:对应App外部存储的getExternalFilesDir()目录<external-path>:对应外部存储根目录(注意动态权限申请)<cache-path>:对应App内部的getCacheDir()目录<external-cache-path>:对应App外部存储的getExternalCacheDir()目录
给你一个标准的正确配置示例(以映射App内部文件目录为例):
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- name是自定义的路径别名,path写"."表示映射整个目录,也可指定子目录 --> <files-path name="internal_files" path="."/> <!-- 如果需要用到外部存储的文件,可添加这行配置 --> <external-files-path name="external_files" path="."/> </paths>如果需求是让其他App访问assets文件,换个实现思路
因为FileProvider无法直接访问assets,你需要先把assets里的目标文件复制到FileProvider支持的目录(比如内部files目录),再通过FileProvider提供访问Uri。示例代码如下:// 将assets中的指定文件复制到App内部可访问目录 private void copyAssetToAccessibleDir(Context context, String assetFileName) { try (InputStream assetIn = context.getAssets().open(assetFileName); OutputStream fileOut = context.openFileOutput(assetFileName, Context.MODE_PRIVATE)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = assetIn.read(buffer)) != -1) { fileOut.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } }复制完成后,就可以通过FileProvider获取该文件的Uri,正常分享给其他App使用了。
优化清单文件的兼容性
你的清单配置逻辑没问题,但如果是AndroidX项目,建议把android.support.v4.content.FileProvider替换为androidx.core.content.FileProvider,避免老支持库的兼容性问题:<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider>
内容的提问来源于stack exchange,提问作者brax7
相关产品推荐
相关产品推荐

