安卓应用重启后尝试打开文件夹时出现权限错误

8

我的应用程序中有一个偏好设置页面,询问用户要将文件保存到哪个位置。使用Storage Access Framework返回此位置作为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)
2个回答

7
问题在于我需要为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)

很有趣,我的应用程序长时间运行良好,而不需要做这个。 - lasec0203
我有一个问题,在使用startActivityForResult时它可以工作,但是当我使用registerForActivityResult时却不行,你能告诉我为什么吗? - Bhavin Patel

5

1
我已经在我的代码中有了那个。不过我想......它看起来好像从未被应用过。即使我在takePersistableUriPermission之后立即调用contentResolver.persistedUriPermissions,它也会返回一个空数组。 - m33ts4k0z
什么是标志? - Murtaza Khursheed Hussain
哪些标志?问题上的所有代码都可用。 - m33ts4k0z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接