所以这一直让我忙碌。
我正在自定义一个图库,用户可以在其中选择一个或多个图像,我正在使用一个使用CursorLoader
的现有项目。几乎每个项目都使用媒体库URI来查询内存中的所有图像。但是,我只想要扫描特定目录并显示图像。
几行代码完全符合我的要求:
final String imagesDirectory = "/storage/sdcard0/DCIM/"
String selection = MediaStore.Images.Media.DATA + " LIKE '" + imagesDirectory + "%'";
cl = new CursorLoader(MultiImageChooserActivity.this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, img.toArray(new String[img.size()]), selection, null, null);
我在SO上找到的这段代码的选择部分,但它也检索子目录中的所有图像,这是我不想要的。一个解决方案可能是检查MediaStore.Images.Media.DATA
列是否包含与imagesDirectory
相同的斜杠,这应该有效:
imagesDirectory: /storage/sdcard0/DCIM/ -> 4
/storage/sdcard0/DCIM/photo.jpg -> 4, direct child
/storage/sdcard0/DCIM/subdir/otherphoto.jpg -> 5, in subdir
我发现在SQLite中,这样的查询应该有效(检查/
的出现次数):
SELECT LENGTH(col) - LENGTH(REPLACE(col, '/', ''))
其中col
应该是MediaStore.Images.Media.DATA
,但到目前为止我已经尝试了很多不同的selection
变体,但我还没有设法过滤数据。由于您无法提供CursorLoader
一个rawQuery
(如Cursor
),我也无法做到。
我尝试的另一件事是不使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI
作为内容URI,而是使用目录中的URI。所以我尝试了这个:
final String imagesDirectory = "/storage/sdcard0/DCIM/"
cl = new CursorLoader(MultiImageChooserActivity.this,
Uri.fromFile(new File(imagesDirectory)),
img.toArray(new String[img.size()]), null, null, null);
但无济于事。
问题:如何使用CursorLoader
查询目录中的所有图像,而不查询其子目录?
我不是SQLite,查询和CursorLoaders
的英雄,所以这可能会解释一下。此外,我确实在搜索SO以寻找类似的问题,但在这个特定主题上找不到多少。甚至谷歌搜索directory cursorloader
也没有回答任何问题。大多数结果是关于按目录排序的SO帖子......
提前致谢。
答案 0 :(得分:0)
我设法通过使用扩展条款来解决这个问题:
String where = "_data LIKE '/storage/sdcard0/DCIM/%' AND (SELECT LENGTH(_data) - LENGTH(REPLACE(_data, '/', ''))) = 4";
其中/storage/sdcard0/DCIM/
是我的图像目录,4
是图像目录名称中的斜杠数量。我在几个不同的目录上尝试了这个(并手动检查它们),它似乎工作正常。
我也会尝试使用pskinks方法(DATA like [dir]/%.jpg and DATA not like [dir]/%/%
),并报告结果。