最近在写我的个人应用KeepassA时,遇到了android文件uri生命周期的问题,被文件真实路径的获取搞得有点懵逼。从android p开始,谷歌对文件访问的权限限制的更加变态了,如果想兼容大多数机型,使用谷歌提供的ASF框架是一个很好的选择。
但是该框架只能返回文件的uri,并不能返回文件路径,并且随着android的进一步升级,特别是从android Q 开始,已经完全无法从uri获取到文件真实路径了!!
一、uri 过期
出现的异常有:
java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider
原因:
1、如果你通过AFS获取文件uri使用Intent.ACTION_OPEN_DOCUMENT 或Intent.ACTION_GET_CONTENT 时,系统只会给你一个临时的uri访问权限,当你的设备重新启动后,该uri就没有了权限。
如:
Intent.ACTION_GET_CONTENT
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
this.type = type
addCategory(Intent.CATEGORY_OPENABLE)
addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)