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
相关产品推荐
相关产品推荐

