我正在查询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_&_Melo-X_Present..._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
错误
这怎么可能?我自己从互联网上下载了这些图片!它们应该存在于磁盘中。
答案 0 :(得分:0)
您似乎正在使用LoaderMananger / ManagedQuery来查询Android中的媒体内容提供商。 Content Provider只是一种从不同应用程序访问特定SQLite数据库的方法。如果您使用Android提供的媒体内容提供商,则必须使用MediaScannerConnection“手动”更新它,以添加您放置的新文件,因为在您的应用运行时,“服务”可能会在内部更新,也可能不会在内部更新
以下是一些相关的SO问题: Scan Android SD card for new files 和Trigger mediascanner on specific path (folder), how to?但我不建议全局扫描SD卡的答案。
答案 1 :(得分:0)
如果这是三星设备,则所有这些路径可能都不正确!
//将其放入您的代码中,然后记录“外部”字符串以查看
String external = Environment.getExternalStorageDirectory();
如果你说:/ storage / sdcard0 /
然后三星自己说你必须做这个蹩脚的追加(我声称他们打破了API:)
external = external + "/external_sd/";
我不确定这是否适用于下载,但我怀疑它会影响所有类似的子路径。
[编辑:]告诫Emptor!即使这在某些三星设备上也不起作用。 ARRRRGGGGGG