由於最近工作需求的原因,有一個功能就是將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是掃描文件的格式。這樣我們可以直接掃描添加特定的文件。提高了速度
不是悶騷的程序員算不上程序員。我的微信公眾號“那點鼻事”,在這里周一到周五每天一篇文章,與技術無關,只哈牛逼。