Android 生成文件,電腦連接數據線無法查看的解決方法 ——MediaScannerConnection 刷新媒體庫

MediaScannerConnection

MediaScannerConnection 作用是爲應用提供一個媒體掃描服務,當有新創建或者下載的文件時,會從該文件讀取元數據並將該文件添加到媒體中去。

當我們添加一個文件的時候,我們需要刷新媒體庫才能立即找得到添加文件,MediaScannerConnection可以爲我們解決這一問題。

 

ACTION_MEDIA_MOUNTED 不能使用

在 Android 4.4 之後,ACTION_MEDIA_MOUNTED 這個廣播只能由系統發出,APP 只能監聽,不能廣播,所以通過發送廣播的方式來讓系統掃描文件的做法已經是走不通了。

 

MediaScannerConnection 的優點

ACTION_MEDIA_MOUNTED 廣播的優點是對於開發者,調用簡單。缺點也是有的,一是開發者可以發送任意多次,也就是發送頻率完全由開發者自己決定,二是掃描的範圍也由開發者自己決定。這兩個缺點容易被惡意使用,系統只能被動的接受掃描任務。另外一個缺點就是開發者拿不到掃描的結果。

MediaScannerConnection 的實現方式,從名字上大概就可以猜測出來,它是開發者 app 進程和系統掃描進程的連接器,通過它 app 進程可以調用系統掃描進程的方法,並且可以對掃描的結果進行回調。這樣就可以避免了 app 進程隨意觸發掃描任務,也解決了 app 進程收不到掃描結果的問題了。

 

那麼我們就來看看怎麼使用MediaScannerConnection 去刷新媒體庫。

1. 構造方法

MediaScannerConnection(Context context, MediaScannerConnection.MediaScannerConnectionClient client)

//MediaScannerConnectionClient 是媒體掃描服務在MediaScannerConnection類中返回新添加文件的 uri  和 path
new MediaScannerConnection(this,
                new MediaScannerConnection.MediaScannerConnectionClient() {
            @Override
            public void onMediaScannerConnected() {
            // MediaScanner service 創建後回調
            }

            @Override
            public void onScanCompleted(String path, Uri uri) {
              // 當MediaScanner完成文件掃描後回調
            }
        });

2.連接掃描服務

connect();
//Initiates a connection to the media scanner service

3.掃描文件(scanFile)

<!--path 文件絕對路徑-->
void scanFile (String path, String mimeType)

void scanFile (Context context, String[] paths,  String[] mimeTypes,MediaScannerConnection.OnScanCompletedListener callback)

通過上面兩種方式去掃描文件, 
第一種方式通過,如果在構造防範中添加了監聽回調,會在其回調中得到其uri; 
第二種方式,可以選擇添加掃描完成監聽獲取掃描文件的uri 。

MimeType 的選擇

mimeTypes 可以爲空。

如果指定 MimeType ,將會使用文件的後綴名來判斷文件的類型,但是千萬別用 */* ,我以爲使用這個它會自動判斷文件的類型的,結果不是這樣子的。使用 */* 的結果就是掃描完成後,相冊裏的圖片全部沒有出現在 MediaStore 裏,也就是沒有被當成多媒體文件掃描進多媒體數據庫裏。

4.斷開掃描服務

void disconnect ()
Releases the connection to the media scanner service.

注意:以下兩個方法 是 ServiceConnection 接口的方法,不要調用。

onServiceConnected(ComponentName className, IBinder service)

onServiceDisconnected(ComponentName className)

通過上述方法就能在添加文件後,掃描添加到媒體庫,就會立刻出現在文件夾中了。

參考:https://blog.csdn.net/Hana_one/article/details/79964749

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章