如何获取getExternalFilesDir指定目录下的图片?现有代码返回全部图库图片
解决方法
你的代码当前查询了MediaStore中所有外部存储的图片,要只获取getExternalFilesDir(Environment.DIRECTORY_PICTURES)目录下的图片,需要通过文件路径筛选缩小查询范围,具体实现如下:
1. 核心修改点
- 获取应用私有图片目录的完整路径
- 在MediaStore查询时添加路径筛选条件,只保留目标目录下的图片
- 优化Cursor遍历逻辑,避免冗余代码
2. 修改后的完整代码
public class GalleryPhotoActivity extends AppCompatActivity { ActivityGalleryPhotoBinding binding; ArrayList<Uri> imageuris = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityGalleryPhotoBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 获取应用私有图片目录的绝对路径 File targetDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); String targetPath = targetDir.getAbsolutePath(); String[] projection = new String[]{ MediaStore.Images.Media._ID, MediaStore.Images.Media.SIZE, MediaStore.Images.Media.DATE_MODIFIED, MediaStore.Images.Media.DATA // 添加路径字段用于筛选 }; // 筛选路径包含目标目录的图片 String selection = MediaStore.Images.Media.DATA + " LIKE ?"; String[] selectionArgs = new String[]{targetPath + "%"}; // 可选:按修改时间倒序排列图片 String orderby = MediaStore.Images.Media.DATE_MODIFIED + " DESC"; Uri content_uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursor cursor = getContentResolver().query(content_uri, projection, selection, selectionArgs, orderby); if (cursor != null) { // 简化Cursor遍历逻辑 while (cursor.moveToNext()) { long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); Uri image_uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); imageuris.add(image_uri); } cursor.close(); // 关闭Cursor避免内存泄漏 binding.rv.setLayoutManager(new GridLayoutManager(this, 3)); RvAdapter adapter = new RvAdapter(imageuris); binding.rv.setAdapter(adapter); } } }
额外说明
- 该目录属于应用私有外部存储目录,卸载应用时会被自动删除;Android 10(API 29)及以上版本访问此目录无需申请
READ_EXTERNAL_STORAGE权限 - 若需兼容Android 9及以下版本,需在Manifest中添加
READ_EXTERNAL_STORAGE权限,并完成动态权限申请
内容的提问来源于stack exchange,提问作者Patrick Renaud
相关产品推荐
相关产品推荐

