ОБНОВЛЕНИЕ
У меня Samsung Galaxy S8 + с 8.0.0 T-Mobile, который отлично работает при работе 8.0.0
Мой Samsung Galaxy S9 + работает под управлением 8.0.0 Verizon, он терпит неудачу каждый раз с недопустимым аргументом.
Мой Samsung Galaxy S9 + под управлением 8.0.0 T-Mobile не имеет проблем и работает нормально
Так что это может быть проблема конкретной модели OEM, но пока не уверен, как ее исправить.Я также попытался перезагрузить телефон, без изменений в результатах.
Кроме того, я открыл открытые загрузки из Evernote и сохранил файл как приложение к заметке, которая сообщает мне, что Evernote может получить доступ кПубличный каталог просто отлично и прикрепить файл, так что это можно сделать на устройстве.Приводит меня к мысли, что это связано с кодом.
Итак, я недавно обновил проект, который работал просто отлично, и теперь у него есть ошибка, теперьКомпиляция с инструментами сборки 28 для последней версии Android.
Так что я всегда использовал этот PathUtil, чтобы получить путь к файлу, который мне нужен, из неявного намерения получить выбор файла от пользователя.Ниже я поделюсь ссылкой на код, который я давно использую.
PathUtil
Это просто служебный класс, который проверяет полномочия провайдера иполучает абсолютный путь к файлу, который вы пытаетесь прочитать.
Когда пользователь выбирает файл из общедоступного каталога загрузок, он возвращается к onActivityResult с:
content://com.android.providers.downloads.documents/document/2025
Теперь хорошая утилита анализирует это и говорит мне, что это файл каталога загрузки и документ с идентификатором 2025. Спасибо, утилита, это отличное начало.
Далее следует использовать контентраспознаватель, чтобы найти абсолютный путь к файлу.Это то, что раньше работало, но больше не работает: (.
Теперь утилита пути просто использует данные контракта, которые они, скорее всего, получили из базовой библиотеки сами. Я попытался импортировать класс провайдерачтобы избежать статических строк, но, кажется, они недоступны, поэтому я думаю, что на данный момент лучшим способом будет использование соответствующих строк.
Вот базовый DownloadProvider для справки, который обеспечивает весь доступдля преобразователя содержимого. DownloadProvider
ПРИМЕЧАНИЕ * Этот DownloadProvider предназначен для Android, а не для меня
Вот код, который создает Uri для contentProvider
val id = DocumentsContract.getDocumentId(uri)
val contentUri = ContentUris.withAppendedId(Uri.parse(PUBLIC_DOWNLOAD_PATH), id.toLong())
return getDataColumn(context, contentUri, null, null)
ссылки на вызовы:
private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array<String>?): String? {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor != null && cursor.moveToFirst()) {
val column_index = cursor.getColumnIndexOrThrow(column)
return cursor.getString(column_index)
}
}catch (ex: Exception){
A35Log.e("PathUtils", "Error getting uri for cursor to read file: ${ex.message}")
} finally {
if (cursor != null)
cursor.close()
}
return null
}
По сути, содержимое, которое должно быть разрешено, становится
содержимым: // downloads / public_downloads / 2025
Затем при вызове метода запроса выдается:
java.lang.IllegalArgumentException: неизвестный URI: content: // downloads / public_downloads / 2025
Вещи, которые я подтвердил или попробовал
- Чтение внешних разрешений (поставляется с записью, но все равно сделал)
- Запись внешних разрешений
- Разрешения находятся в манифесте и извлекаются во время выполнения
- Я выбрал несколько разных файлов, чтобы посмотреть, не странно ли один
- Я подтвердил, что разрешения предоставлены в настройках приложения
- Я жестко закодировал Uri в / 1 или даже / # 2052 в конце, чтобы попробовать различные типы окончания
- Я исследовал uriMatching в базовой библиотеке, чтобы посмотреть, как он ожидает, что он будет отформатировани убедился, что он соответствует
- Я поиграл с каталогом all_downloads в URI, и это разрешает !!, но с исключением из-за безопасности, так что решатель должен существовать.
Не знаюзнаете, что еще попробовать, любая помощь будет оценена.