直接简单粗暴上解决办法了,网上虽然有一大堆,但是基本上没提到某些细节。
第一步
res/xml/file_paths.xml
(没有?当然没有啦,自己创建一个!)
然后,直接将下面的代码粘贴上去好吧,直接粘!!!
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
path="Android/data/${applicationId}/"
name="files_root" />
<external-path
path="."
name="external_storage_root" />
</paths>
上面的能满足基本的外置存储读写操作了,如果要细分的话,自己百度,关键字:“Android FileProvider”
第二步
打开 AndroidManifest.xml
清单文件。
<application
...
android:requestLegacyExternalStorage="true">
<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/file_paths" />
</provider>
</application>
先给我记住 android:authorities="${applicationId}.provider"
这一行的.provider
。
第三步
配置完成之后,我们在对应的代码中请求文件格式如下:
Uri uri= FileProvider.getUriForFile(getApplicationContext(), getApplicationContext().getPackageName() + ".provider", apkfile.result);
intent.setDataAndType(uri, "MIME type 自己写了");
为什么上面第二步要让你记住.provider
。
这里就用上了getApplicationContext().getPackageName() + ".provider"
为什么专门再抄一遍这个东西?就是某些Blog直接上来就复制,粘贴,然后报错闪退,然后就又继续百度。
问题复现
举个栗子:
某些人第二步写的是:android:authorities="${applicationId}.provider
然后到了第三步写一个:getApplicationContext().getPackageName() + ".fileProvider"
不匹配的呀,哥哥。