You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题排查与分析

  1. 旧API兼容性问题:Environment.getExternalStoragePublicDirectory()是已废弃的API,在Android 10及以上版本的Scoped Storage规则下,应用无法直接访问公共目录的所有文件,必须通过MediaStore接口进行查询。
  2. MediaStore索引延迟:部分文件(如HTML、JPG)可能未被MediaStore及时索引,导致查询结果缺失。可以通过发送ACTION_MEDIA_SCANNER_SCAN_FILE广播触发媒体扫描,或者等待系统自动完成索引更新。
  3. 查询条件匹配问题:不带通配符的查询可能因严格匹配规则无法命中目标文件,使用LIKE '%.html'的通配符筛选方式能更精准地定位HTML文件。

内容的提问来源于stack exchange,提问作者Phlip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:07:09