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())
        }
        ...

    
Другие вопросы по тегам