2012-10-11 291 views
2

我查詢Android設備上的所有圖像這樣:爲什麼File.Exists返回false?

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

/存儲/ sdcard0 /下載/397277_10151250943161341_876027377_n.jpg

/存儲/ sdcard0 /下載/ Roxy_Cottontail_ & _Melo-X_Present ..._ Some_Bunny_Love's_You.jpg

/存儲/ sdcard0 /下載/專輯最滾動的石頭,有些-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

這怎麼可能?我從互聯網上自己下載這些圖片!它們應該存在於磁盤中。

+1

您正在編譯什麼API級別,並且您是否擁有正確的EXTERNAL_STORAGE權限? –

+0

我的目標是框架2.3。我沒有READ_EXTERNAL_STORAGE,但我確實有WRITE_EXTERNAL_STORAGE。添加READ之後得到相同的結果 –

+0

我正在使用Android支持V4 –

回答

0

您似乎在使用LoaderMananger/ManagedQuery來查詢Android中的媒體內容提供程序。內容提供者只是從不同應用程序訪問特定SQLite數據庫的一種方式。如果您使用Android提供的媒體內容提供程序,則必須使用MediaScannerConnection「手動」更新它,以添加已放置的新文件,因爲在應用程序運行時,「服務」可能會或可能不會在內部進行更新。

這裏有一些相關的SO問題: Scan Android SD card for new filesTrigger mediascanner on specific path (folder), how to?但我不建議的全球掃描你的SD卡中的答案。

0

如果這是三星設備,所有這些路徑可能不正確!

在你的代碼//將這個,然後登錄「外部」的字符串,看看

String external = Environment.getExternalStorageDirectory(); 

如果你說:/存儲/ sdcard0/

然後三星自己說,你所要做的這種跛腳的append(我要求他們打破了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

[編輯:]買者自負!即使這在某些三星設備上不起作用。 ARRRRGGGGGG