使用android文件系統時,我可以注意到一個我自己無法真正解釋的問題。通過使用File.renameTo()
或File.delete()
(如果圖像有任何Exif
數據不管)結果如下更改圖像(如上回報true
提到的方法):如何使用文件系統同步文件重命名/刪除
File.renameTo()
:畫廊仍顯示舊名稱由去詳細信息和下面發佈的方法也返回一個空的縮略圖(當然,因爲路徑指向應該刪除的文件)File.delete()
:圖像從文件系統中消失了(沒有很多測試文件探測器顯示它和new File(pathToDeletedImage).exists()
返回false
),但畫廊仍然顯示圖像包括。所有細節
問題:我是否需要以某種方式通知畫廊我剛纔對圖像文件所做的更改?
我用得到的縮略圖的方法:
private Bitmap getThumbnail(ContentResolver cr, String path)
throws Exception {
Cursor ca = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.MediaColumns._ID },
MediaStore.MediaColumns.DATA + "=?", new String[] { path },
null);
if (ca != null && ca.moveToFirst()) {
int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
ca.close();
return MediaStore.Images.Thumbnails.getThumbnail(cr, id,
MediaStore.Images.Thumbnails.MICRO_KIND, null);
}
ca.close();
return null;
}
UPDATE
好吧,我想通了,我們需要同步與文件系統中的任何文件更改。我的猜測是像File.delete()
和File.renameTo()
這樣的操作在Linux上運行,但上面也有Android。我以編程方式刪除了DCIM
目錄後重置了我的Nexus 5,但圖庫只是拒絕重新創建,並且如果手動重新創建,也拒絕使用它,因此所有相機圖像都只是空白。清除緩存並重新啓動沒有幫助。如果它發生在用戶的設備上,我認爲我的開發人員評分會降至負值。
我只能找出如何正確地刪除圖像,下面的代碼工作且其變動同步(用於重命名不起作用不過):
private void broadcastScanFile(File f) {
Intent intentNotifyImgDeleted = new Intent();
intentNotifyImgDeleted.setType("image/*");
intentNotifyImgDeleted.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intentNotifyImgDeleted.setData(Uri.fromFile(f));
sendBroadcast(intentNotifyImgDeleted);
}
現在的問題是:怎麼辦我刪除/重命名任何文件/目錄,以便更改與文件系統正確同步?
P.S.是的,我知道如何使用搜索,到目前爲止還沒有找到任何合適的解決方案。
如果要重命名你需要播放兩套URI的文件路徑我會想? (舊的和新的)。或者是一個高於兩者的URI(包含目錄)。小心使用容器 - 如果目錄包含非常多的文件,媒體掃描程序可能需要一段時間才能完成。 – Stevie
非常感謝回答 – hybrid