为什么自定义相册不显示新建文件夹内的图片,重命名后才正常展示?
问题根因
你当前的代码通过查询系统MediaStore获取相册数据,而你通过代码新建文件夹并保存图片后,系统媒体库不会自动扫描新增的目录和文件,因此MediaStore中没有对应记录,你的查询自然无法返回新建文件夹的内容。你在文件管理器中重命名文件夹时,会触发系统对该目录的自动媒体扫描,相关图片会被写入MediaStore,因此后续可以正常查询到。
修复方案
你只需要在完成图片保存操作后,主动触发系统媒体扫描对应路径即可,推荐使用MediaScannerConnection实现,兼容全版本安卓系统。
补充扫描逻辑代码
在你保存图片到新建文件夹的逻辑后,添加如下代码:
// 替换为你实际保存的图片文件路径,如果有多个新增图片可以依次传入 String savedImagePath = "/sdcard/你的自定义文件夹/测试图片.jpg"; MediaScannerConnection.scanFile( this, new String[]{savedImagePath}, null, // 传null系统会自动识别文件类型 (path, uri) -> { // 扫描完成后再执行你现有的相册查询逻辑,即可获取到最新的文件夹和图片数据 // 若需要更新UI,请切换到主线程执行操作 } );
原有查询逻辑代码(无需修改)
ArrayList<imageFolder> picFolders = new ArrayList<>(); ArrayList<String> picPaths = new ArrayList<>(); Uri allImagesuri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Images.ImageColumns.DATA , MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.BUCKET_ID}; Cursor cursor = this.getContentResolver().query(allImagesuri, projection, null, null, null); try { if (cursor != null) { cursor.moveToFirst(); } do{ imageFolder folds = new imageFolder(); String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)); String folder = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)); String datapath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); //String folderpaths = datapath.replace(name,""); String folderpaths = datapath.substring(0, datapath.lastIndexOf(folder+"/")); folderpaths = folderpaths+folder+"/"; if (!picPaths.contains(folderpaths)) { picPaths.add(folderpaths); folds.setPath(folderpaths); folds.setFolderName(folder); folds.setFirstPic(datapath); folds.addpics(); picFolders.add(folds); }else{ for(int i = 0;i<picFolders.size();i++){ if(picFolders.get(i).getPath().equals(folderpaths)){ picFolders.get(i).setFirstPic(datapath); picFolders.get(i).addpics(); } } } }while(cursor.moveToNext()); cursor.close(); } catch (Exception e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Sachin Rale
相关产品推荐
相关产品推荐

