[Android] 針對產生的圖片檔案在系統Gallery不顯示的處理,
之前遇到過一個問題,就是發現我在程式中產生一個新的 Bitmap 之後,當我開啟系統的 Gallery 查看時,並沒有看到新產生的映像。然而開啟檔案瀏覽器,找到儲存 Bitmap 所在的檔案夾下,還能看到程式產生的 Bitmap 檔案。也就是說,檔案其實存在,但 Gallery 似乎並沒有重新整理。之後,又一個新的行為證實了我的觀點,即,每次重啟裝置之後, Gallery 中就會顯示新產生的 Bitmap 了。也就是說,重啟裝置之後,系統對某個儲存有圖片資訊的檔案進行了重新讀寫(當時得出的是這麼個結論,具體原理後面會專門寫部落格討論)。
好了,原理能猜出個大概,那麼就猜一猜方法:也許可以通知系統來對儲存有圖片資訊的那個檔案進行重新整理,做一次對檔案夾的掃描。但到底有沒有這個方法呢?帶著疑問,我在網上找了找資料,發現原理的確是這麼回事,方法也是有的。
本文地址:http://www.cnblogs.com/rossoneri/p/4239152.html
現在有兩個方法可以解決這個問題:
Solution 1: 發送廣播,通知系統重新整理。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
不過用這個方法需要給程式添加許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RESTART_PACKAGES" />
這個方法我沒有測試,但看介紹應該是可以的。
Solution 2: 使用 MediaScannerConnection :
首先對要使用該方法的類繼承 MediaScannerConnectionClient :
public class YourView implements MediaScannerConnectionClient {}
繼承該類需要重寫兩個方法:
@Overridepublic void onMediaScannerConnected() { // TODO Auto-generated method stub try { msc.scanFile(bitmapPath, "image/jpg"); } catch (Exception e) { e.printStackTrace(); }}@Overridepublic void onScanCompleted(String path, Uri uri) { // TODO Auto-generated method stub msc.disconnect();}
方法看其名稱就能猜到,前者是串連上 MediaScanner 後,進行尋找檔案。 bitmapPath 是檔案的絕對路徑,"image/jpg" 是檔案格式, jpg 可改為 png 甚至 * 。後者方法是尋找結束後中斷連線。
最後,建立 MediaScannerConnection 對象,在產生圖片後調用其方法:
MediaScannerConnection msc;.....if (msc != null) { msc.disconnect();}msc = new MediaScannerConnection(mActivity, thisClass.this);msc.connect();
這樣,下次再產生新的圖片後,就可以在 Gallery 中看到新產生的圖片了!
恩,問題解決了。然後我又發現了一個問題:如果我在程式中刪除了某個圖片,結果發現 Gallery 中還有這個圖片的路徑,能看到有這個圖片,但開啟圖片是一片灰色。說簡單點,就是我用代碼刪除圖片檔案了,系統的儲存資訊還是有這個檔案的路徑存在,只有重啟才會刪掉這些無效路徑。好了,問題來了,怎麼改?
能不能像之前的步驟再來一次?前面的步驟好像是重新整理了系統的某個設定檔,再做一次也許會行。嘗試之後發現(第一種方法沒試。。),然而並不行。
既然這樣不行,那也許是我對系統的某些原理還沒有搞懂,應該還有其他的方法。經過一番探索,我還是找到瞭解決方法,並且對 Android 系統掃描儲存這些資訊的原理有了進一步的瞭解。下一篇文章,就簡單討論討論這個原理和解決辦法。今天先到這裡。
參考資料:
[Android執行個體] 把bitmap儲存後無法在圖庫看到,但檔案是存在的
Image, saved to sdcard, doesn't appear in Android's Gallery app