Я использую сторонний файловый менеджер, чтобы выбрать файл (в моем случае PDF) из файловой системы.
Вот как я запускаю деятельность:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);
String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);
startActivityForResult(chooser, ActivityRequests.BROWSE);
Вот что у меня есть onActivityResult
:
Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}
Фрагмент кода заимствован из инструкций диспетчера файлов Open Intents, доступных здесь:
http://www.openintents.org/en/node/829
Цель if-else
- обратная совместимость. Интересно, лучший ли это способ получить имя файла, поскольку я обнаружил, что другие файловые менеджеры возвращают все, что угодно.
Например, Documents ToGo возвращает что-то вроде следующего:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
на который getContentResolver().query()
возвращается null
.
Чтобы сделать вещи более интересными, безымянный файловый менеджер (я получил этот URI из клиентского журнала) возвращал что-то вроде:
/./sdcard/downloads/.bin
Есть ли предпочтительный способ извлечения имени файла из URI или следует прибегнуть к синтаксическому анализу строк?
Ответы:
На сайте developer.android.com есть хороший пример кода: https://developer.android.com/guide/topics/providers/document-provider.html.
Сжатая версия для простого извлечения имени файла (при условии, что «this» является действием):
источник
file://
кcontent://
вonScanCompleted(String path, Uri uri)
метод stackoverflow.com/a/5815005/2163045new String[]{OpenableColumns.DISPLAY_NAME}
в качестве второго параметра запроса отфильтрует столбцы для более эффективного запроса.OpenableColumns.DISPLAY_NAME
у меня не сработало, я использовалMediaStore.Files.FileColumns.TITLE
.java.lang.IllegalArgumentException: Invalid column latitude
файлом. Хотя отлично работает для фотографий!Я использую что-то вроде этого:
источник
cursor
нетclose()
?Взято из получения информации о файле | Разработчики Android
Получение имени файла.
источник
Самые простые способы получить имя файла:
Если они не дают вам правильного имени, вы должны использовать:
источник
File(uri.path).name
работает, спасибо!Если вы хотите, чтобы это было коротко, это должно сработать.
источник
Я использую приведенный ниже код, чтобы получить имя файла и размер файла из Uri в моем проекте.
источник
Самая сжатая версия:
источник
Для Kotlin вы можете использовать что-то вроде этого:
источник
источник
источник
Если вы хотите иметь имя файла с расширением, я использую эту функцию, чтобы получить его. Он также работает с выбором файлов на Google Диске
источник
Моя версия ответа на самом деле очень похожа на @Stefan Haustein. Я нашел ответ на странице разработчика Android Получение информации о файле ; информация здесь по этой конкретной теме даже более сжатая, чем на сайте руководства Storage Access Framework . В результате запроса индекс столбца, содержащий имя файла
OpenableColumns.DISPLAY_NAME
. Ни один из других ответов / решений для индексов столбцов у меня не работал. Ниже приведен пример функции:источник
Сначала вам нужно преобразовать ваш
URI
объект вURL
объект, а затем использоватьFile
объект для получения имени файла:Это очень просто.
источник
Функция Стефана Хаустейна для xamarin / c #:
источник
Это действительно сработало для меня:
источник
Пожалуйста, попробуйте это:
источник
Комбинация всех ответов
Вот к чему я пришел после прочтения всех представленных здесь ответов, а также того, что некоторые Airgram сделали в своих SDK - утилита, исходный код которой я открыл на Github:
https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils
использование
Как просто , как вызов,
UriUtils.getDisplayNameSize()
. Он предоставляет как имя, так и размер содержимого.Примечание: Работает только с content: // Uri.
Вот краткий обзор кода:
источник