在Android 11中,由于隐私限制的修改,File.listFiles()函数可能无法返回所有文件。解决此问题的最佳方法是使用新的媒体访问框架(MediaStore)来获取指定扩展名的所有文件。以下是代码示例:
private List getFilesWithExtension(String extension) {
List files = new ArrayList<>();
ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Files.getContentUri("external");
String[] projection = {MediaStore.Files.FileColumns.DATA};
String selection = MediaStore.Files.FileColumns.DISPLAY_NAME + " LIKE ? AND " + MediaStore.Files.FileColumns.MEDIA_TYPE + " = ?";
String[] selectionArgs = new String[]{"%" + extension, String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_NONE)};
String sortOrder = null;
Cursor cursor = resolver.query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null) {
int dataColumnIndex = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
while (cursor.moveToNext()) {
String filePath = cursor.getString(dataColumnIndex);
files.add(new File(filePath));
}
cursor.close();
}
return files;
}
上述代码中,我们使用MediaStore.Files.getContentUri("external")来获取存储在外部存储的媒体文件的URI。我们使用MediaStore.Files.FileColumns.DISPLAY_NAME和MediaStore.Files.FileColumns.MEDIA_TYPE来创建选择条件,以获取指定扩展名的所有文件,同时排除媒体文件。最后,我们使用ContentResolver来查询数据库并获取File对象列表。