最近做的一個需求是:將拍照或相冊的圖片上傳服務(wù)器后刪除對應(yīng)的本地圖片。在實(shí)現(xiàn)這個簡單的需求的過程中卻碰到了兩個意想不到的問題。
這兩個問題源自于刪除本地圖片時選用的兩個不同的方法
file.delete
很明顯,圖片也是File的一種,所以完全可以使用file.delete方法來刪除本地圖片。
public static void deletePicture(String localPath) {
if(!TextUtils.isEmpty(localPath)){
File file = new File(localPath);
if (file.exists()) {
file.delete();
}
}
}
但是,很快就發(fā)現(xiàn),file.delete方法在刪除記錄在媒體數(shù)據(jù)庫里面的圖片時會有個明顯的問題:刪除不干凈。即使file.delete方法執(zhí)行返回ture提示刪除成功,在圖庫或者其他圖片選擇庫里面還是會顯示該圖片的縮略圖(或者空白圖)。這是因?yàn)槭褂胒ile.delete方法只是刪除了本的圖片,但并沒有通知媒體數(shù)據(jù)庫刪除該圖片的縮略圖。
contentResolver.delete
contentResolver.delete可以解決上面所說的問題,刪除圖片的縮略圖不再在圖庫或者其他圖片選擇庫里顯示。
public static void deletePicture(String localPath, Context context) {
if(!TextUtils.isEmpty(localPath)){
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = context.getContentResolver();
String url = MediaStore.Images.Media.DATA + "=?";
contentResolver.delete(uri, url, new String[]{localPath});
}
}
但是,在刪除經(jīng)過自己裁剪壓縮處理后保存起來的圖片時卻發(fā)現(xiàn):不能刪除這些圖片,contentResolver.delete方法返回值為0。
出現(xiàn)這個問題的原因是:因?yàn)閳D片創(chuàng)建時并沒有通知(插入到)媒體數(shù)據(jù)庫,所以contentResolver查詢時沒有找到這張圖片,當(dāng)然就無法刪除了,這時候反過來可以使用file.delete方法刪除。
結(jié)合contentResolver.delete和file.delete
綜上所述,可以結(jié)合contentResolver.delete和file.delete實(shí)現(xiàn)本地圖片的刪除。
public static void deletePicture(String localPath, Context context) {
if(!TextUtils.isEmpty(localPath)){
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = context.getContentResolver();
String url = MediaStore.Images.Media.DATA + "=?";
int deleteRows = contentResolver.delete(uri, url, new String[]{localPath});
if (deleteRows == 0) {//當(dāng)生成圖片時沒有通知(插入到)媒體數(shù)據(jù)庫,那么在圖庫里面看不到該圖片,而且使用contentResolver.delete方法會返回0,此時使用file.delete方法刪除文件
File file = new File(localPath);
if (file.exists()) {
file.delete();
}
}
}
}