android保存照片到相冊的一些事


  由於最近工作需求的原因,有一個功能就是將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是掃描文件的格式。這樣我們可以直接掃描添加特定的文件。提高了速度

    


不是悶騷的程序員算不上程序員。我的微信公眾號“那點鼻事”,在這里周一到周五每天一篇文章,與技術無關,只哈牛逼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM