在Android开发中判断视频文件大小可以通过多种方式实现,以下列举几种核心方法及相关扩展知识:
1. 通过File对象获取大小
使用`File.length()`方法直接获取视频文件的字节数:
java
File file = new File("/sdcard/video.mp4");
long sizeInBytes = file.length();
float sizeInMB = sizeInBytes / (1024f * 1024f);
需注意:
- 需要`READ_EXTERNAL_STORAGE`权限(Android 10+可能需使用MediaStore API)。
- 文件路径需适配不同设备存储路径(如外部存储、应用专属目录)。
2. 通过MediaStore查询视频大小
适用于Android 10+的Scoped Storage,通过ContentResolver查询:
java
Cursor cursor = getContentResolver().query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Video.Media.SIZE},
MediaStore.Video.Media._ID + "=?",
new String[]{videoId},
null
);
if (cursor != null && cursor.moveToFirst()) {
long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.SIZE));
}
优势:避免直接文件路径访问,符合新存储规范。
3. 通过Uri获取输入流计算大小
适用于通过Intent获取的视频Uri(如用户从文件管理器选择):
java
try (InputStream is = getContentResolver().openInputStream(uri)) {
long size = is.available(); // 对部分Uri可能不准确
// 更可靠的方式是遍历流计算字节总数
}
注意:`available()`可能返回不完整结果,大文件建议分块读取。
4. FFmpeg或MediaMetadataRetriever获取元数据
使用`MediaMetadataRetriever`可提取视频时长、格式等信息,但文件大小仍需通过上述方法获取。
扩展知识:
精度问题:文件系统统计的字节数可能与实际占用空间不一致(如磁盘簇大小影响)。
网络视频:需通过`HttpURLConnection`获取`content-length`响应头(需处理重定向和分块传输)。
权限适配:Android 11+的`MANAGE_EXTERNAL_STORAGE`权限需单独申请并符合Google Play审核要求。
性能优化:大文件遍历时建议采用`BufferedInputStream`减少IO开销。
实际开发中需根据场景选择合适方案,兼容性、权限和性能是关键考虑因素。