MediaStore - Uri для запроса всех типов файлов (медиа и немедиа)

В классе MediaStore.Files упоминается, что

Таблица поставщика мультимедиа, содержащая индекс всех файлов в хранилище мультимедиа, включая файлы, не относящиеся к мультимедиа.

Меня интересуют запросы на файлы, не относящиеся к мультимедиа, такие как PDF.

Я использую CursorLoader для запроса базы данных. Второй параметр конструктора требует аргумента Uri, который легко получить для типов мультимедиа Audio, Images и Video, поскольку для каждого из них определены константы EXTERNAL_CONTENT_URI и INTERNAL_CONTENT_URI.

Для MediaStore.Files такой определенной константы нет. Я попытался использовать метод getContentUri(), но не смог определить значение аргумента для volumeName. Я попытался указать «/ mnt / sdcard», а также имя тома, которое появляется, когда я подключаю устройство к моей системе, но тщетно.

Я видел аналогичный вопрос в группах Google, но это не решено.

РЕДАКТИРОВАТЬ: Я также пробовал использовать Uri.fromFile (новый файл ("/ mnt / sdcard /")) и Uri.parse (новый файл ("/ mnt / sdcard"). ToString ()), но это тоже не сработало .


person Shyam Prasad Murarka    schedule 30.04.2012    source источник
comment
только немедиафайлы? Как в случае не .jpg .avi .mp3, а только .txt и т. Д.?   -  person zapl    schedule 30.04.2012
comment
Ага. Только немедиафайлы. Для .jpg, .avi и т. Д. Я могу использовать классы Audio, Video и Images.   -  person Shyam Prasad Murarka    schedule 30.04.2012


Ответы (1)


Это "external" или "internal", хотя внутренние (системные файлы) здесь, вероятно, бесполезны.

ContentResolver cr = context.getContentResolver();
Uri uri = MediaStore.Files.getContentUri("external");

// every column, although that is huge waste, you probably need
// BaseColumns.DATA (the path) only.
String[] projection = null;

// exclude media files, they would be here also.
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
        + MediaStore.Files.FileColumns.MEDIA_TYPE_NONE;
String[] selectionArgs = null; // there is no ? in selection so null here

String sortOrder = null; // unordered
Cursor allNonMediaFiles = cr.query(uri, projection, selection, selectionArgs, sortOrder);

Если вы хотите .pdf, только вы можете проверить mimetype

// only pdf
String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
String[] selectionArgsPdf = new String[]{ mimeType };
Cursor allPdfFiles = cr.query(uri, projection, selectionMimeType, selectionArgsPdf, sortOrder);
person zapl    schedule 30.04.2012
comment
Большое спасибо! :) Как ты это понял? Я довольно много искал в Интернете. Я наткнулся на external, но использовал его как Uri.fromParts (content, external), что не сработало. - person Shyam Prasad Murarka; 30.04.2012
comment
Посмотрев на исходные коды - Uri.parse("content://media/external/file") или Uri.fromParts("content", "media/external/file", null) должны сделать то же самое. - person zapl; 30.04.2012
comment
@AshwinSAshok Нет, таблица files не существовала до Honeycomb. Не было списка всех файлов. Если вам нужны файлы, отличные от аудио, изображений или видео, вам придется вручную просмотреть файловую систему, чтобы найти их. - person zapl; 03.01.2014
comment
Как получить только файлы фото, а не только изображения. Следует ли мне отображать файлы непосредственно из папки DCIM вместо использования ContentResolver? - person HendraWD; 08.11.2016
comment
@zapl, если я хочу добавить PDF, DOC, PPT, xls, txt в MIMEtype одним курсором, не могли бы вы мне помочь !!! - person ; 17.04.2017
comment
@ Kushan2 либо удалите предложение where и фильтруйте в java-коде, либо добавьте все mimetypes в предложение where, например например stackoverflow.com/q/6258856/995891 - sqlite.org/lang_select.html - person zapl; 17.04.2017
comment
для MediaStore. загрузки - person sk panchal; 23.03.2020
comment
Строковые значения доступны как константы в MediaStore (например, VOLUME_EXTERNAL). Дополнительные сведения см. В документации. - person jkemming; 28.12.2020