Как вывести список всех файлов pdf на android 10?

Из-за изменений, связанных с авторизацией доступа к общему хранилищу, поиск по всем документам типа pdf с помощью этого подхода (с requestLegacyExternalStorage = "false") больше не представляется возможным:

ContentResolver cr = context.getContentResolver();
Uri uri = MediaStore.Files.getContentUri("external");
String[] projection = null;
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
                    + MediaStore.Files.FileColumns.MEDIA_TYPE_NONE;
String[] selectionArgs = null;
String sortOrder = null;
Cursor allNonMediaFiles = cr.query(uri, projection, selection, selectionArgs, sortOrder);

Проверьте эту ссылку: Ограничения медиа-данных

Единственное решение, которое я вижу, - это рекурсивное сканирование всего дерева общего хранилища с помощью SAF, что мне кажется очень дорогостоящим по ресурсам и смешным.

Есть у кого-нибудь еще идея?

2 ответа

Основная идея ограниченного хранилища состоит в том, чтобы избежать такого поведения, вы не можете знать, есть ли какие-то файлы где-то в телефоне пользователя. Вы можете просто запросить разрешение на доступ к дереву хранилища и просканировать все, как вы сказали. Даже в этом случае пользователь может выбрать папку, отличную от корневой, поэтому ваше приложение будет ограничено этой папкой. Идея может заключаться в том, чтобы выполнить сканирование, а затем обновить вашу базу данных с синхронизацией, используя задание (службу заданий), запланированное на изменение URI дерева и потомков.

Если ваш проект ориентирован на Sdk level 29, вы должны добавить в свой AndroidManifest.xml флаг android:requestLegacyExternalStorage="true" под вашим <application> тег.

 public List<String> queryFilesFromDevice(Uri uri, String[] projection, String selection, final Context context) {
    final List<String> tempList = new ArrayList<>();
    Cursor c = context.getContentResolver().query(uri, projection,
            selection,
            null,
            null);
    if (c != null) {

        while (c.moveToNext()) {
            String path = c.getString(0);
            long size = c.getLong(1);
         // your code logic should be here
        }
        c.close();
    }
    tempList.add(path);
    return tempList;
}

вам нужно вызвать функцию так:

String pdfExt = "_data LIKE '%.pdf'";
Uri ducumentsUri = MediaStore.Files.getContentUri("external");
String[] docsProjection ={MediaStore.Files.FileColumns.DATA,MediaStore.Images.Media.SIZE,MediaStore.Files.FileColumns.MIME_TYPE,};
queryFilesFromDevice(ducumentsUri, docsProjection, pdfExt, this);
Другие вопросы по тегам