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

