众所周知,Android 11 使用了专属目录,并且强制启用。关于专属目录的介绍,这里不详细多说,因为官方文档已经很明确了,这里主要介绍我保存在外部存储根目录
遇到的一些坑。
专属目录,就是Android11为应用开辟的专属空间,APP将文件保存到专属目录,不再需要请求存储权限,直接就可以保存。并且其它应用无法访问专属目录里的文件,保证了用户的隐私安全。
而我这里的需求不是将文件保存在专属目录里,也不是保存在媒体目录里,而是外部存储的根目录,新建一个文件夹,保存我的csv文件,并将csv分享出去。
其实之前针对Android 10,我就已经采用了 FileProvider
的做法,但是一年后,同样的代码出现了错误,并且Android10上没问题,Android11出现了问题。
我主要遇到了两个问题,
- Android 10 分享时提示 csv文件不存在:
Failed to find configured root ....
- Android 11 保存为csv时,提示 :
EPERM (Operation not permitted)
下面从头到尾介绍我的解决方法:
1. Manifest.xml
① 在 application
下添加:android:requestLegacyExternalStorage="true"
② 定义 FileProvider: 向您的应用清单添加一个元素。
name
固定使用 androidx.core.content.FileProvider ,
authorities
一般是 包名+fileprovider,
exported
为 false,
grantUriPermissions
为 true,授予对文件的临时访问权限,用来分享。
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.adsale.registersite.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 version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
&