Android 內容提供者重新整理圖片 和 Arraylist排序,
前言: 把我之前自己寫的圖片選取器轉移到我們公司的項目裡了,然後發現了無數的坑,一路填過來,很難受,不過最終還是搞的差不多了,代碼還沒傳,下篇隨筆在給串連,先把標題要講的寫出來
1我以前一直不懂內容提供者為什麼能成為四大組件之一(我技術這麼菜是有原因的!!),現在才懂一點
不管是刪除圖片,還是新拍圖片,都要通過內容提供者通知安卓系統一聲,否則
添加圖片如果不通知一下,結果就是拍下來的圖片在手機相簿裡找不到,並且通過內容提供者尋找圖片也查不到,但是你去你設定好的路徑去看,它就安靜的在那裡!!!
刪除圖片如果不通知一下,結果就是通過內容提供者尋找圖片的時候,還能找到已經被刪掉的圖片的地址,但其實那個地址已經沒有圖片了!!!
具體怎麼通知
添加圖片
MediaScannerConnection.scanFile(this, new String[]{圖片的絕對路徑}, null, null);
在這裡要說一下第2個坑,百度上比較多的文章都是寫的先插入到系統圖庫,在通知。
代碼是醬嬸兒的
try { MediaStore.Images.Media.insertImage(context.getContentResolver(), output.getAbsolutePath(), output.getName(), null); } catch (FileNotFoundException e) { e.printStackTrace(); } context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, imageUri));
坑在哪裡,第一點:我是先把圖片儲存到我指定的路徑了,然後在調用的上面的方法,然後重點來了,相簿裡和我的指定路徑裡各有一張圖片!!!
第二,在低版本手機裡(我用的模擬器),經過這麼一弄,內容提供者一下找出來倆一樣的圖片,高版本手機呢,只找到相簿裡那一張,如果那相簿裡的刪掉,那我指定路徑裡的圖片留在手機裡浪費記憶體!!!
總之我個人認為上面的辦法略坑。
再說刪除圖片
private void DeleteImage(String imgPath) { ContentResolver resolver = context.getContentResolver(); Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?", new String[]{imgPath}, null); boolean result = false; if (cursor.moveToFirst()) { long id = cursor.getLong(0); Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri uri = ContentUris.withAppendedId(contentUri, id); int count = context.getContentResolver().delete(uri, null, null); result = count == 1; } else { File file = new File(imgPath); result = file.delete(); } if (result) { Toast.makeText(context, "刪除成功", Toast.LENGTH_LONG).show(); } }
3按修改先後的順序柏拉圖片(時間順序)(剛拍完的在前)
因為所有的照片都被我以bean的形式儲存在list裡了,所以簡單地說就是list的排序問題
先擷取圖片的修改時間
new Date(file.lastModified()).getTime() //file 就是圖片
之後就是一個讓我驚呆了的排序方法(java太菜沒有辦法)
讓我得bean類 實現Compartor介面,然後實現compare方法
@Override public int compare(PhotoBean o1, PhotoBean o2) { if(o1.getTime() > o2.getTime()){ return -1; }else{ return 1; } }
這個排序方法不多解釋了,百度就好,但是我今天才知道這樣子排序,驚了個呆!!
排序的時候直接
Collections.sort(list, new bean類);
就好了,這樣就實現Arraylist的排序了
4最後看一下模擬器上的效果吧,模擬器沒有網路攝影機不過不影響效果