Почему разрешение дерева Uri истекает, несмотря на флаг намерения GRANT_PERSISTABLE_URI_PERMISSION?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему разрешение дерева Uri истекает, несмотря на флаг намерения GRANT_PERSISTABLE_URI_PERMISSION?

Сообщение Anonymous »

Я пытаюсь создать редактор текстовых файлов со списком файлов, созданных с помощью DrawerLayout и NaviagtionView. Первоначально пользователь сталкивается с действием, предлагающим ему выбрать каталог с файлами с помощью кнопки с кодом прослушивания ниже.

Код: Выделить всё

    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
resultLauncher.launch(intent)

Код: Выделить всё

    private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
if (it.resultCode == Activity.RESULT_OK){
val receivedIntent: Intent = it.data!!
contentResolver.takePersistableUriPermission(receivedIntent.data!!, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
val myIntent = Intent(this, MainActivity::class.java)
myIntent.data = receivedIntent.data
startActivity(myIntent) // Starts the Main Activity
finish()
}
}
В onCreate основного действия getIntent().data передается методу ниже для заполнения меню NaviagtionView.

Код: Выделить всё

    private val viewDocumentTable: Hashtable = Hashtable()
private fun addMenuFilesFromDirectory(directoryUri: Uri){
val childDocuments = DocumentFile.fromTreeUri(applicationContext, directoryUri)!!.listFiles()
for (file in childDocuments){
if (contentResolver.getType(file!!.uri) == DocumentsContract.Document.MIME_TYPE_DIR){
addMenuFilesFromDirectory(file.uri)
}
else if (MimeTypeMap.getFileExtensionFromUrl(file.uri.toString()) == "txt"){
Log.d("","${file.name}, ${file.exists()}") // file name and "true" is logged for every item
val mItem = navigationView.menu.add(file.name)
viewDocumentTable[mItem] = file
}
}
}
При щелчке по элементу MenuItem выполняется следующий код.

Код: Выделить всё

    for (script in viewDocumentTable.elements()){ // Debug purpose
Log.d("", "${script.name}, ${script.exists()}") // "null, false" is logged for every item;
// A warning is also logged: "Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs"
}
val stream = contentResolver.openInputStream(viewDocumentTable[clickedMenuItem]!!.uri) // Logs exception "fail to open file: No such file or directory"
val reader = InputStreamReader(stream)
myEditText.setText(reader.readText())
stream!!.close()
reader.close()
Ожидаемый результат: текст myTextEdit станет содержимым файла, соответствующего выбранному элементу MenuItem.

Вместо этого я попробовал сохранить Uri DocumentFile, который дал тот же результат.

Все тестирование проводилось на устройстве Android 11. Разрешения на чтение, запись и управление внешним хранилищем указаны в манифесте и при необходимости также запрашиваются во время выполнения. Для minSdk установлено значение 28, а для targetSdk установлено значение 34.


Подробнее здесь: https://stackoverflow.com/questions/786 ... permission
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»