Код: Выделить всё
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()
}
}
Код: Выделить всё
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
}
}
}
Код: Выделить всё
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()
Вместо этого я попробовал сохранить Uri DocumentFile, который дал тот же результат.
Все тестирование проводилось на устройстве Android 11. Разрешения на чтение, запись и управление внешним хранилищем указаны в манифесте и при необходимости также запрашиваются во время выполнения. Для minSdk установлено значение 28, а для targetSdk установлено значение 34.
Подробнее здесь: https://stackoverflow.com/questions/786 ... permission
Мобильная версия