Android开发:如何在下载文件夹中查找HTML等已下载文件?
在Android下载文件夹中查找HTML等已下载文件
问题描述
需要在Android的Downloads文件夹中查找HTML等已下载文件,但当前尝试的方法均存在问题:
- 不带文件名通配符的Scoped Storage查询无法生效
- 调用
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).listFiles()返回结果异常
现有代码仅能识别Downloads文件夹内的两个PNG文件,无法获取JPG和HTML文件。需求是无需用户手动通过文件选择器操作,直接获取HTML文件列表。
Downloads文件夹实际内容:
gts9pwifi:/ $ ls -l ./storage/emulated/0/Download/ total 272 -rwxrwx--- 1 u0_a241 media_rw 16725 2024-04-14 08:31 FLIP0000\ Project\ Zone\ Report.html -rwxrwx--- 1 u0_a241 media_rw 104503 2023-08-12 21:53 earthgrazer_ansmet_big.jpg -rw-rw---- 1 u0_a241 media_rw 68188 2024-04-14 10:27 screenshot_bitmap.png -rw-rw---- 1 u0_a241 media_rw 79125 2024-04-14 10:27 screenshot_filename_drawn.png.png
注:文件权限不影响该问题,无此权限的平板也会出现同样情况,权限来源未知。
正确的Scoped Storage实现方式
采用Android官方推荐的Scoped Storage机制,通过MediaStore查询Downloads目录下的HTML文件,代码示例如下:
public static void listFilesInDownloadsFolder(Context context) { Uri uri = MediaStore.Downloads.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Downloads._ID, MediaStore.Downloads.DISPLAY_NAME, MediaStore.Downloads.SIZE, MediaStore.Downloads.DATE_ADDED }; String sortOrder = MediaStore.Downloads.DATE_ADDED + " DESC"; String selection = MediaStore.Downloads.DISPLAY_NAME + " LIKE ?"; String[] selectionArgs = new String[]{"%.html"}; try (Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder)) { if (cursor != null && cursor.moveToFirst()) { do { // 获取文件详情 long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Downloads._ID)); String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Downloads.DISPLAY_NAME)); long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Downloads.SIZE)); long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Downloads.DATE_ADDED)); // 处理或打印文件信息 System.out.println("文件: " + displayName + ", 大小: " + size + ", 添加时间: " + dateAdded); } while (cursor.moveToNext()); } } catch (Exception e) { e.printStackTrace(); } }
问题排查与分析
- 旧API兼容性问题:
Environment.getExternalStoragePublicDirectory()是已废弃的API,在Android 10及以上版本的Scoped Storage规则下,应用无法直接访问公共目录的所有文件,必须通过MediaStore接口进行查询。 - MediaStore索引延迟:部分文件(如HTML、JPG)可能未被MediaStore及时索引,导致查询结果缺失。可以通过发送
ACTION_MEDIA_SCANNER_SCAN_FILE广播触发媒体扫描,或者等待系统自动完成索引更新。 - 查询条件匹配问题:不带通配符的查询可能因严格匹配规则无法命中目标文件,使用
LIKE '%.html'的通配符筛选方式能更精准地定位HTML文件。
内容的提问来源于stack exchange,提问作者Phlip
相关产品推荐
相关产品推荐

