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

Android编程获取PDF文件大小:两种尝试方法遇异常求助

读取PDF文件大小的问题解决方案

嘿,我来帮你搞定这个读取PDF文件大小的问题!你提到已经配置了所有权限、拥有文件访问权,用file.length()对图片有效但读PDF返回0,还有用Cursor的方法没写完,我来给你分析原因并提供可行的方案。

先分析file.length()返回0的可能原因

最常见的问题是Android 10(API 29)及以上的Scoped Storage限制:即使你申请了READ_EXTERNAL_STORAGE权限,直接用File对象访问外部存储(比如Download目录)的文件,系统可能会限制实际的文件访问,导致file.length()返回0——虽然File对象能创建,但实际并没有读取到真实的文件内容。

另外也可以先排查基础问题:

  • 用file.exists()和file.isFile()确认文件真的存在,如果返回false,那肯定是路径写错了
  • 打印file.getAbsolutePath(),确认是不是指向你要的那个PDF文件

可行的解决方案

方案1:符合Scoped Storage规范的ContentResolver方法(推荐Android 10+使用)

不管是自己保存的PDF还是用户选择的文件,用ContentResolver获取文件大小是最稳妥的方式,不会受Scoped Storage限制。

如果你知道文件的路径(比如Download目录)

String pdfPath = "/storage/emulated/0/Download/c4611_sample_explain.pdf";
Uri contentUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
// 只查询文件大小字段
String[] projection = {MediaStore.Downloads.SIZE};
// Android 11+用RELATIVE_PATH和DISPLAY_NAME匹配更稳妥
String selection = MediaStore.Downloads.RELATIVE_PATH + "=? AND " + MediaStore.Downloads.DISPLAY_NAME + "=?";
String[] selectionArgs = {"Download/", "c4611_sample_explain.pdf"};

Cursor cursor = getContentResolver().query(contentUri, projection, selection, selectionArgs, null);
if (cursor != null) {
    if (cursor.moveToFirst()) {
        long fileSizeBytes = cursor.getLong(cursor.getColumnIndex(MediaStore.Downloads.SIZE));
        int fileSizeKB = (int) (fileSizeBytes / 1024);
        // 这里可以处理获取到的大小
        System.out.println("PDF文件大小:" + fileSizeKB + " KB");
    }
    cursor.close();
}

如果是通过文件选择器获取的Uri

直接用openFileDescriptor获取文件大小,这个方法通用且简单:

private long getPdfSizeFromUri(Uri pdfUri) {
    long fileSize = 0;
    try (ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(pdfUri, "r")) {
        if (pfd != null) {
            fileSize = pfd.getStatSize();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fileSize;
}

调用后把返回的fileSize转成KB/MB即可:int sizeKB = (int) (fileSize / 1024);

方案2:兼容旧版本的File方法(Android 9及以下或开启Legacy Storage)

如果你需要兼容Android 9及以下,或者想继续用File方法,可以在AndroidManifest.xml的<application>标签里添加开启Legacy Storage的配置:

<application
    ...
    android:requestLegacyExternalStorage="true">
    <!-- 其他配置 -->
</application>

然后再用File方法,但要注意避免int溢出(文件超过2GB时int存不下,建议用long存储):

String path = "/storage/emulated/0/Download/c4611_sample_explain.pdf";
File pdfFile = new File(path);
if (pdfFile.exists() && pdfFile.isFile()) {
    long fileSizeBytes = pdfFile.length();
    long fileSizeKB = fileSizeBytes / 1024;
    System.out.println("PDF文件大小:" + fileSizeKB + " KB");
} else {
    System.out.println("文件不存在或不是有效文件");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:56