Android - Java - MediaStore - Как использовать выделение для нескольких условий
Я не хочу получать все файлы документов (Docs) с устройства Android. Я использую ContentResolver с MediaStore.Files, чтобы добиться этого. Я могу получить все файлы из одного типа, например: pdf, но мне интересно, как получить файлы из нескольких типов.
Мой код:
String selection = MediaStore.Files.FileColumns.MIME_TYPE + "=?" +
"";
String[] selectionArgs = new String[] { MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf")};
ArrayList<MyFile> list = new ArrayList<MyFile>();
Uri contentUri = MediaStore.Files.getContentUri("external");
String[] columns = {
MediaStore.Files.FileColumns.MIME_TYPE ,
MediaStore.Files.FileColumns.MEDIA_TYPE ,
MediaStore.Files.FileColumns.DATA ,
};
String SortOrder = null;
Cursor cursor = contentR.query(contentUri ,
columns ,
selection ,
selectionArgs ,
SortOrder);
Как я могу использовать selection & selectioArgs для нескольких условий, как в SQL: ИЛИ, И... В selectionArgs будут все типы файлов, которые я ищу: pdf, txt, doc...
Например: Selection = MediaStore.Files.FileColumns.MIME_TYPE + "=?" + "ИЛИ" + MediaStore.Files.FileColumns.MIME_TYPE + "=?";
SelectionArgs = {"pdf", "txt"};
Спасибо за любую помощь или направление:-)
2 ответа
Вам просто нужно добавить больше selectionArgs, каждый для каждого типа файла. Или вы просто создаете список или массив, который содержит все типы файлов в виде строк. Далее вам нужен только цикл, который переходит к следующему типу файла, пока не останется больше. Например:
ArrayList<MyFile> list = new ArrayList<MyFile>();
ArrayList<String> fileTypeArray = new ArrayList<DString>();
for(int i = 0; i < fileTypeArray.size(); i++){
String selection = MediaStore.Files.FileColumns.MIME_TYPE + "=?" + "";
String[] selectionArgs = new String[] { MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileTypeArray.get(i))};
Uri contentUri = MediaStore.Files.getContentUri("external");
String[] columns = {
MediaStore.Files.FileColumns.MIME_TYPE ,
MediaStore.Files.FileColumns.MEDIA_TYPE ,
MediaStore.Files.FileColumns.DATA ,
};
String SortOrder = null;
Cursor cursor = contentR.query(contentUri ,
columns ,
selection ,
selectionArgs ,
SortOrder);
}
Другой альтернативой является не включать MIME_TYPE в выборку, но наличие его в столбцах позволяет вам проверять его при обработке каждой записи в курсоре.
Что-то вроде:
val projection - arrayOf(
MediaStore.Downloads.MIME_TYPE,
...
if (cursor.count > 0) {
val mimeColumn : Int =
cursor.getColumnIndex(MediaStore.Files.FileColumns.MIME_TYPE)
cursor.use { cursor ->
cursor.moveToFirst()
do {
val mimeType = cursor.getString(mimeColumn)
...
if( mimeType == MediaStore.Downloads.MIME_TYPE ) { // or wherever...
// process it
}
} while (cursor.moveToNext())
}
...