Android Storage Access Framework (SAF): как прочитать файл во внутреннем браузере?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Android Storage Access Framework (SAF): как прочитать файл во внутреннем браузере?

Сообщение Anonymous »

Из-за ограничений, наложенных Google, у меня больше нет доступа для чтения всех файлов в Android API 33+. Я предполагал, что смогу легко использовать Storage Access Framework (SAF) для вывода списка файлов в каталоге, выбранном пользователем через «ACTION_OPEN_DOCUMENT_TREE».
Вот как я это попробовал:

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

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
m_OpenDocumentTreeLauncher.launch(intent)
Я могу получить доступ к каталогу и просмотреть все файлы в нем во внутреннем браузере следующим образом:

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

val childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, DocumentsContract.getTreeDocumentId(rootUri))
val contentResolver = requireContext().contentResolver

val projection = arrayOf(
DocumentsContract.Document.COLUMN_DOCUMENT_ID,
DocumentsContract.Document.COLUMN_DISPLAY_NAME,
DocumentsContract.Document.COLUMN_SIZE,
DocumentsContract.Document.COLUMN_MIME_TYPE,
)

val cursor = contentResolver.query(childrenUri, projection, null, null, null)
if (cursor != null)
{
try
{
while (cursor.moveToNext())
{
val docId = cursor.getString(0)
val name = cursor.getString(1)
val size = cursor.getLong(2)
val mimeType = cursor.getString(3)

fileList.add(rootUri.authority.toString(), docId, name, size, mimeType)
}
}
finally {
cursor.close()
}
}
RootUri — это Uri выбранного каталога через ACTION_OPEN_DOCUMENT_TREE.
docId — это идентификатор выбранного файла.
И загружаем этот файл примерно так:

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

        val documentUri = DocumentsContract.buildDocumentUri(fileList.authority, fileList.docId)
val contentResolver = requireContext().contentResolver
val inputStream = contentResolver.openInputStream(documentUri)
Uri для файла, который я получаю в этом примере:
content://com.android.externalstorage.documents/document/9C35-6BCD%3ATest%2FTestFile.txt
Пока все хорошо. Теперь, когда я пытаюсь щелкнуть этот файл, чтобы загрузить его содержимое в FileStream, я сталкиваюсь с проблемой. Я постоянно получаю сообщение об ошибке:
"Отказ в разрешении: чтение com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/document/9C35-6BCD%3ATest% 2FTestFile.txt из pid=22147, uid=10488 требует, чтобы вы получили доступ с помощью ACTION_OPEN_DOCUMENT или связанных API"
Я предполагал, что у меня будет доступ к файлам в этом каталоге, выбранным пользователем через «ACTION_OPEN_DOCUMENT_TREE». Разве это не так? Как я могу открыть/прочитать файл в этой папке, не прибегая к «ACTION_OPEN_DOCUMENT»? Я предпочитаю использовать внутренний браузер из-за его простоты и скорости, а также из-за лучшего взаимодействия с пользователем. Эта функция больше невозможна или есть альтернативный подход? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/782 ... al-browser
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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