Как вывести список всех файлов 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);