圖片的保存與更新到媒體庫(kù)
基本流程:檢查/請(qǐng)求權(quán)限,保存到應(yīng)用程序私有目錄,通知媒體庫(kù)更新
在調(diào)用保存圖片到方法之前,先檢查權(quán)限,使用
并且清單里應(yīng)當(dāng)有
【重寫(xiě)回調(diào)方法以得到授權(quán)情況】
PackageManager是一個(gè)系統(tǒng)級(jí)別的類,用于管理和查詢Android設(shè)備上已安裝的應(yīng)用程序信息。通過(guò)該類提供的方法,可以獲取應(yīng)用程序的包名、版本號(hào)、權(quán)限信息等,并可以查詢?cè)O(shè)備上已安裝的應(yīng)用程序列表。
是一個(gè)自定義的外存寫(xiě)權(quán)限的狀態(tài)碼,可以表示用戶首次使用軟件時(shí)判斷到用戶未授權(quán)并請(qǐng)求授權(quán),使用ActivityCompat.requestPermissions()方法請(qǐng)求授權(quán)。這個(gè)方法需要傳入一個(gè)字符串?dāng)?shù)組,表示要請(qǐng)求的權(quán)限列表,以及一個(gè)整數(shù)值,也就是這個(gè)狀態(tài)碼。
【保存圖片到本地的方法】
是應(yīng)用程序的私有路徑。
【通知媒體庫(kù)顯示這張圖片】
低于10的安卓版本直接就插入到媒體庫(kù)了。從Android 10開(kāi)始,訪問(wèn)外部存儲(chǔ)設(shè)備上的文件需要使用新的API,并且需要進(jìn)行特殊處理。將圖片信息存放到一個(gè)ContentValues對(duì)象里,它用于在應(yīng)用程序中將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中或從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。
具體的內(nèi)容可以參考官方文檔:https://developer.android.com/training/data-storage/shared/media
MediaScannerConnection.scanFile()
可以掃描指定的文件并將其添加到系統(tǒng)媒體庫(kù)中。一般來(lái)說(shuō),當(dāng)相機(jī)或錄音應(yīng)用程序拍照或錄音時(shí),這些文件會(huì)自動(dòng)被添加到系統(tǒng)媒體庫(kù)中。但是,如果應(yīng)用程序創(chuàng)建了一些圖片、視頻或音頻文件,就要使用該方法。
第一個(gè)參數(shù)是上下文(Context)對(duì)象,第二個(gè)參數(shù)是要掃描的文件路徑。當(dāng)調(diào)用該方法后,系統(tǒng)會(huì)異步地掃描指定的文件,并將其添加到系統(tǒng)媒體庫(kù)中??梢灾貙?xiě)onScanCompleted()
方法,該方法會(huì)在文件掃描完成后被調(diào)用。
context.getContentResolver().insert()
用于將數(shù)據(jù)插入到指定的ContentProvider中。第一個(gè)參數(shù)是Uri對(duì)象,表示要插入數(shù)據(jù)的ContentProvider的位置,即MediaStore.Images.Media.EXTERNAL_CONTENT_URI;第二個(gè)參數(shù)是ContentValues對(duì)象。
這兩個(gè)API可能會(huì)結(jié)合使用。使用context.getContentResolver().insert()
方法將該圖片的信息插入到系統(tǒng)媒體庫(kù)的ContentProvider中,以便其他應(yīng)用程序能夠訪問(wèn)該圖片。然后,使用MediaScannerConnection.scanFile()
方法掃描該圖片,并將其添加到系統(tǒng)媒體庫(kù)中,以確保該圖片能夠在相冊(cè)等應(yīng)用程序中顯示出來(lái)。
需要注意的是,在使用MediaScannerConnection.scanFile()
方法時(shí),不需要插入數(shù)據(jù)到ContentProvider中。該方法只是將指定的文件添加到系統(tǒng)媒體庫(kù)中,但不會(huì)在ContentProvider中創(chuàng)建對(duì)應(yīng)的記錄。
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
用于訪問(wèn)外圖片文件??梢酝ㄟ^(guò)該URI來(lái)查詢、插入、更新和刪除外部存儲(chǔ)設(shè)備中的圖片文件。
例如,使用ContentResolver
類的query()
方法來(lái)查詢符合特定條件的圖片文件,并獲取它們的相關(guān)信息,如文件名、大小、日期等。還可以使用insert()
方法將新的圖片文件插入到外部存儲(chǔ)設(shè)備中,并使用update()
和delete()
方法來(lái)更新和刪除已有的圖片文件。
URI是Uniform Resource Identifier(統(tǒng)一資源標(biāo)識(shí)符),用于標(biāo)識(shí)和定位一個(gè)資源的字符串標(biāo)識(shí)符。它可以用來(lái)唯一地標(biāo)識(shí)網(wǎng)絡(luò)上的資源、本地文件、數(shù)據(jù)庫(kù)記錄等等。
URL是Uniform Resource Locator(統(tǒng)一資源定位器),是一種特殊的URI,用于指定網(wǎng)絡(luò)上的資源的位置。URL包含了協(xié)議、主機(jī)名、路徑、查詢參數(shù)等信息,可以被瀏覽器和其他應(yīng)用程序用來(lái)獲取互聯(lián)網(wǎng)上的資源。
URI和URL的區(qū)別在于,URI只是一個(gè)標(biāo)識(shí)符,用于唯一地標(biāo)識(shí)一個(gè)資源,而URL則包含了更多的信息,用于定位和獲取該資源。