android - 在 Android 应用程序中重新启动后尝试打开文件夹时出现权限错误
问题描述
我的应用程序中有一个首选项页面,要求用户提供保存文件的位置。这个地方使用存储访问框架作为 URI 返回,我可以使用它在活动之间存储文件。问题是,在我重新启动手机后,我从 sharedPreferences 中检索 URI,并收到以下信息:
DocumentFile: Failed query: java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider from ProcessRecord (pid=23302, uid=10334) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
这是启动意图的代码:
folderPicker = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
folderPicker.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
startActivityForResult(folderPicker, READ_REQUEST_BY_USER)
和 onActivityResult:
val takeFlags: Int = folderPicker.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
activity!!.contentResolver!!.takePersistableUriPermission(uri, takeFlags)
val sharedPref = PreferenceManager.getDefaultSharedPreferences(activity?.baseContext)
with (sharedPref.edit()) {
putString("savePathURI", uri.toString())
commit()
}
这就是我尝试重新访问文件夹的方式:
var uri = PreferenceManager.getDefaultSharedPreferences(this).getString("savePathURI","")
var getSelectedDocument = DocumentFile.fromTreeUri(applicationContext, Uri.parse(uri))!!
var params = BridgeParams(applicationContext, links, filesDir.absolutePath, button, getResources(), progressBar3, getSelectedDocument, contentResolver)
编辑:我注意到调用 contentResolver.persistedUriPermissions 总是返回一个空数组,即使我在之后调用它:
activity!!.contentResolver!!.takePersistableUriPermission(uri, takeFlags)
解决方案
问题是我需要为ACTION_OPEN_DOCUMENT_TREE添加额外的标志:
folderPicker = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
folderPicker.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
)
startActivityForResult(folderPicker, READ_REQUEST_BY_USER)
推荐阅读
- wordpress - 将自定义帖子类型显示到静态页面
- performance - 如何改进有两种情况的haskell代码?
- r - ggplot2 为值和日期/日期时间指定辅助轴
- radio-button - 如何在不改变其外观的情况下禁用面板上的 TRAdioButtons?
- python - 构建一个发送到不和谐的推特监视器
- spring-boot - Maven Sure-Fire - StartupReportConfiguration 的 ClassNotFoundException
- angular - Angular Universal (SSR),带有 Leaflet 和 ngx-leaflet
- c# - 如何在使用输出绑定到服务总线的天蓝色函数中记录错误?
- sql - SQL 不使用连接查找所有销售订单
- python - 如何智能地从单个 .csv 文件导入多个 pandas 数据帧?