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

Android 10+ Shared Storage存图片重名时获取真实文件名及文件大小方法问询

获取系统自动生成的真实文件名

你调用ContentResolver.insert()返回的Uri就对应了系统生成的媒体文件记录,直接通过这个Uri查询MediaStore.MediaColumns.DISPLAY_NAME字段即可得到最终文件名,参考代码如下:

String realFileName = null;
String[] projection = new String[]{MediaStore.MediaColumns.DISPLAY_NAME};
try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null)) {
    if (cursor != null && cursor.moveToFirst()) {
        realFileName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME));
    }
} catch (Exception e) {
    e.printStackTrace();
}
// 此时realFileName就是系统最终生成的文件名,包含自动追加的序号

注意:请在写入Bitmap、关闭输出流之后再执行上述查询,避免出现读取到旧数据的问题。

规范获取图片文件大小的方法

你当前使用AssetFileDescriptor获取文件大小的方法是准确的,但是有更轻量化的实现方式:和获取文件名一样,直接查询MediaStore记录中的MediaStore.MediaColumns.SIZE字段即可,不需要打开文件描述符,性能开销更低:

long fileSize = 0;
String[] projection = new String[]{MediaStore.MediaColumns.SIZE};
try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null)) {
    if (cursor != null && cursor.moveToFirst()) {
        fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE));
    }
} catch (Exception e) {
    e.printStackTrace();
}

*两种方案的适用场景说明:

  • 如果你是刚完成文件写入的场景,直接查询MediaStore的SIZE字段即可,效率更高
  • 如果需要读取其他应用创建的媒体文件大小,或者担心MediaStore记录未及时更新,可以继续使用你原本的AssetFileDescriptor方案,准确性更高*

内容的提问来源于stack exchange,提问作者Style-7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:45:04