之前遇到過一個問題,就是發現我在程序中生成一個新的 Bitmap 之後,當我打開系統的 Gallery 查看時,並沒有看到新生成的圖像。然而打開文件浏覽器,找到保存 Bitmap 所在的文件夾下,還能看到程序生成的 Bitmap 文件。也就是說,文件其實存在,但 Gallery 似乎並沒有刷新。之後,又一個新的行為證實了我的觀點,即,每次重啟設備之後, Gallery 中就會顯示新生成的 Bitmap 了。也就是說,重啟設備之後,系統對某個保存有圖片信息的文件進行了重新讀寫(當時得出的是這麼個結論,具體原理後面會專門寫博客討論)。
好了,原理能猜出個大概,那麼就猜一猜方法:也許可以通知系統來對保存有圖片信息的那個文件進行刷新,做一次對文件夾的掃描。但到底有沒有這個方法呢?帶著疑問,我在網上找了找資料,發現原理的確是這麼回事,方法也是有的。
現在有兩個方法可以解決這個問題:
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 {
}
繼承該類需要重寫兩個方法:
@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub
try {
msc.scanFile(bitmapPath, "image/jpg");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public 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 系統掃描存儲這些信息的原理有了進一步的了解。下一篇文章,就簡單討論討論這個原理和解決辦法。今天先到這裡。