標籤:nts dbr 檔案 重啟 啟動 多媒體 pat font activity
由於最近工作需求的原因,有一個功能就是將webView裡面的照片儲存到本地,並且能夠直接在相簿中有一個及時的反饋。
項目中,具體是實現流程是這樣的設計webview點擊互動事件,當點擊webview中的圖片的時候抓取到圖片的url地址;當需要儲存圖片的時候,通過nohttp下載圖片並將圖片儲存到本地,然後更新相簿。
在這裡,抓取url地址和下載圖片的方案有很多,這裡就不在贅述,這裡是說明一下如何更新相簿,因為這裡是一個坑,我一共遇到過兩個方案:
方案一:
發送廣播通知系統更新相簿。
在網上大部分時候是這樣做的,為什麼呢?因為簡單,只需要發送一個廣播就OK了。但是這個方法是一個坑,坑在哪裡,一會在說,這裡先說一個怎麼實現:
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(url.webviewImagePath+"/image.jpg")));File file= (File) object;Uri uri = Uri.fromFile(file);intent.setData(uri);ShowImageActivity.this.sendBroadcast(intent);
上面代碼就是發送廣播中的方式,其中url.webviewImagePath+"/image.jpg"是儲存到本地的地址和圖片格式,file是把下載到圖片的對象object轉換為file。之後發送廣播通知系統更新相簿就好。
那麼現在問題來了,坑在哪裡。主要是下面兩個問題:
1、相簿更新很慢
這是因為我們向系統發送廣播通知,卻不能告知系統重新整理特定的檔案,所以系統會重新整理整個sd卡。這樣一來,自然相簿更新會很慢。
2、部分安卓版本相簿無法更新,重啟手機後會更新
這是因為在部分安卓版本中,考慮到系統安全的問題,是不允許app向系統發送廣播,這樣一來自然無法更新相簿,而另一個方面,手機重新啟動,會重新掛載sd卡,這樣就會重新整理sd開所有東西。
那麼問題來了,既然通過廣播的方式重新整理相簿有這麼多坑,那麼有沒有什麼好的方式呢?這就是第二種方式:
方案二:
使用MediaScanner
什麼是MediaScanner?MediaScanner完成Android中的多媒體檔案的掃描工作。例如,mediascanner掃描系統記憶體和SD卡檔案之後,會將掃描的結果載入在資料庫中,在Music這個應用程式中看到的顯示在activity 的list列表上歌曲專輯名,流派,歌曲時間長度等資訊,都是掃描後的結果放在資料庫中,最後讀到的資料庫中的資訊。這裡可以明白的一點是:多媒體資料庫中的資訊是由MediaScanner添加的。下面就是使用的方式:
class SannerClient implements MediaScannerConnection.MediaScannerConnectionClient { public void onMediaScannerConnected() { if (mFile == null) { return; } scan(mFile, mMimeType); } public void onScanCompleted(String path, Uri uri) { mConn.disconnect(); } private void scan(File file, String type) { if (file.isFile()) { mConn.scanFile(file.getAbsolutePath(), null); return; } //該方法可以遍曆多個檔案,這裡不需要 File[] files = file.listFiles(); if (files == null) { return; } for (File f : file.listFiles()) { scan(f, type); } } } public void scanFile(File file, String mimeType) { mFile = file; mMimeType = mimeType; mConn.connect(); }
在我們需要添加照片到相簿的地方,這幾調用scanFile就可以了,其中兩個參數:file是指添加的檔案,mimeType是掃描檔案的格式。這樣我們可以直接掃描添加特定的檔案。提高了速度
android儲存照片到相簿的一些事