Ошибка разрешения при попытке открыть папку после перезапуска в приложении Android - PullRequest
1 голос
/ 07 июля 2019

У меня есть страница настроек в моем приложении, которая запрашивает у пользователя место для сохранения файла. Это место возвращается как URI с помощью Storage Access Framework, и я могу использовать его для хранения файлов между активами. Проблема в том, что после перезагрузки телефона я получаю URI из sharedPreferences и получаю следующее:

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 ]

1 голос
/ 07 июля 2019

Проблема была в том, что мне нужно было добавить дополнительные флаги для 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)
1 голос
/ 07 июля 2019

Вам нужно позвонить takePersistableUriPermission на onActivityResult

см .: https://developer.android.com/reference/android/content/ContentResolver.html?authuser=1#takePersistableUriPermission(android.net.Uri,%2520int)

...