2

我正在查询 Android 设备上的所有图像:

string[] columns = { MediaStore.Images.Media.InterfaceConsts.Data, 
            MediaStore.Images.Media.InterfaceConsts.Id };
string orderBy = MediaStore.Images.Media.InterfaceConsts.Id;
var imagecursor = ManagedQuery(MediaStore.Images.Media.ExternalContentUri, columns, null, null, orderBy);
for (int i = 0; i < this.Count; i++) {
    imagecursor.MoveToPosition(i);
    Paths[i]= imagecursor.GetString(dataColumnIndex);
    Console.WriteLine(Paths[i]);
    Console.WriteLine(System.IO.File.Exists(Paths[i]));
}

问题是输出显示某些文件不存在。这是一个示例输出:

/storage/sdcard0/Download/On-Yom-Kippur-Jews-choose-different-shoes-VSETQJ6-x-large.jpg
错误
/storage/sdcard0/Download/397277_10151250943161341_876027377_n.jpg
错误
/storage/sdcard0/Download/Roxy_Cottontail_&_ ..._Some_Bunny_Love's_You.jpg
错误
/storage/sdcard0/Download/album-The-Rolling-Stones-Some-Girls.jpg
正确
/storage/sdcard0/Download/some-people-ust-dont-appreciate-fashion[1 ].jpg

/storage/sdcard0/Download/express.gif

...
/storage/sdcard0/Download/some-joys-are-expressed-better-in-silence.JPG

这怎么可能?我自己从网上下载了这些图片!它们应该存在于磁盘中。

4

2 回答 2

0

您似乎正在使用 LoaderMananger/ManagedQuery 来查询 Android 中的媒体内容提供程序。内容提供者只是从不同应用程序访问特定 SQLite 数据库的一种方式。如果您使用 Android 提供的媒体内容提供程序,则必须通过使用 MediaScannerConnection 来“手动”更新它,以添加您放置的新文件,因为在您的应用程序运行时,“服务”可能会或可能不会在内部更新.

以下是一些相关的 SO 问题: 扫描 Android SD 卡以查找新文件在特定路径(文件夹)上触发 mediascanner,如何?但我不推荐全局扫描你的SD卡的答案。

于 2012-10-12T20:13:13.763 回答
0

如果这是三星设备,所有这些路径都可能不正确!

// 将其放入您的代码中,然后记录“外部”字符串以查看

String external = Environment.getExternalStorageDirectory();

如果你说:/storage/sdcard0/

然后三星自己说你必须做这个蹩脚的追加(我声称他们破坏了 API :)

external = external + "/external_sd/";

我不确定这是否适用于下载,但我怀疑它会影响所有类似的子路径。

http://developer.samsung.com/forum/board/thread/view.do?boardName=GeneralB&messageId=162934&messageNumber=1381&startId=zzzzz~&searchType=TITLE&searchText=sdcard

[编辑:] 告诫 Emptor !即使这在某些三星设备上也不起作用。ARRRRGGGGGG

于 2013-05-01T18:09:06.767 回答