應用中關于資料的持久化保存,不管是簡單的SharedPreferences還是資料庫SQLiteDatabase,本質上都是將資料保存到系統的某種型別的檔案中,因此可以直接使用java.io.File檔案類將資料以任意型別存取,
在獲取到File檔案類的物件后,就可以使用其相關方法執行對檔案的讀寫等相關操作,這部分屬于Java語言開發或Kotlin語言開發的基礎知識,不再多言,而在Android系統上因為各種原因,獲取File物件的方式有所區別,本文將重點介紹,
這里需要注意,
File檔案類不僅可以是一個可讀寫資料的正常檔案,也可以是一個包含上述檔案的檔案夾,下文如無特別說明,檔案亦指保存資料的正常檔案和包含正常檔案的檔案夾,
硬體存盤區域
在了解資料的檔案存盤之前,當然要先搞清楚Android系統對硬體存盤設備的劃分規則,
一般設備所安裝Android系統的磁區空間,被定義為Android系統的內部存盤空間,通常應用程式的安裝包及安裝后的相關資料檔案,都默認保存在內部存盤空間中,內部存盤空間為不同應用程式劃分了不同的訪問區間可以操作,而系統用戶是無法正常訪問內部存盤空間的,這有效防止了應用程式間的檔案安全性,
內部存盤的空間往往不會太大,因此不建議應用程式在內部存盤中占用大量空間,于是Android系統又定義了外部存盤空間,應用程式過大的檔案可存盤在外部存盤中,比如相機應用程式所保存的照片,同時外部存盤是允許系統用戶訪問的,這也就是檔案管理應用程式所展示的存盤空間,
而在某些硬體設備中,比如較老版本的移動手機,為了增大硬體存盤空間,還會使用SDcard增加可擴展存盤區,這部分存盤同樣屬于系統的外部存盤空間范疇,
在訪問外部存盤時,應用程式需要申請外部存盤的讀寫權限,包括android.Manifest.permission.READ_EXTERNAL_STORAGE和android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
系統級檔案
所謂系統級檔案,就是該類檔案允許系統中的任何應用程式讀寫訪問,其中外部存盤空間中的檔案都是系統級檔案,
目標版本級別小于29的應用程式
在Android10即API 29以前,手機的外置SD卡可以作為系統級檔案使用,在應用程式中,可以借助android.os.Environment環境類的getExternalStorageDirectory()系列靜態方法獲取外部存盤中的相關File檔案,同時使用isExternalStorageEmulated ()系列靜態方法獲取類似外部存盤是否加載等資訊,
這里獲取外部存盤根目錄的
Environment.getExternalStorageDirectory()方法在API29中廢棄,而在API30中替換為Environment.getStorageDirectory()方法,
目標版本級別等于29的應用程式
從Android10開始,系統引入了磁區存盤的概念,在開啟了磁區存盤的應用程式中,只能訪問其應用級檔案和媒體檔案,應用級檔案在下文會有詳細講解,而所謂的媒體檔案是保存在外部存盤中的,主要包括圖片、音頻、視頻和下載檔案,共四種媒體檔案類,
其中一般圖片存盤路徑為 DCIM/ 和 Picture/ ,并將檔案資訊存盤在MediaStore.Images類定義的相關常量所標記的資料庫中;
音頻存盤路徑為 Alarms/ 、 Audiobooks/、 Music/ 、 Notifications/ 、 Podcasts/ 和 Ringtones/ ,并將檔案資訊存盤在MediaStore.Audio類定義的相關常量所標記的資料庫中;
視頻存盤路徑為 DCIM/ 、 Movies/ 和 Picture/ ,并將檔案資訊存盤在MediaStore.Video類定義的相關常量所標記的資料庫中;
下載檔案存盤路徑為 Download/ ,并將檔案資訊存盤在MediaStore.Downloads類定義的相關常量所標記的資料庫中,
這里的下載檔案路徑MediaStore.Downloads需要特別注意,其路徑只適用于Android10即API 29及以上的系統上,不管應用程式的目標版本級別為多少,只要在Android9及以下版本中,就無法訪問下載檔案路徑的相關內容,
而且在下載檔案路徑中的檔案,如果由非創建該檔案的應用程式所訪問,只能使用存盤訪問框架呼叫系統檔案選擇器與用戶互動,而不能像另外三種媒體檔案一樣直接代碼訪問,
磁區存盤的開啟方式是修改 AndroidManifest.xml 清單檔案,在 <application> 標簽中增加屬性值內容 android:requestLegacyExternalStorage=“false”,這也是默認設定;反之,如果設定android:requestLegacyExternalStorage=“true”則是關閉磁區存盤,官方推薦該配置僅可在檔案兼容性適配階段作為過渡使用,
開啟了磁區存盤的應用程式,在讀寫自己的應用級檔案時,不需要另外申請權限,但是在訪問媒體檔案時,同樣需要外部存盤的讀寫權限,包括android.Manifest.permission.READ_EXTERNAL_STORAGE和android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
而媒體檔案的訪問方式,是通過背景關系環境Context物件的getContentResolver()方法,獲取android.content.ContentResolver內容決議類物件,通過該物件可以對Android系統的資料庫進行增刪改查等操作,其用到的相關常量都可以在上文的四種媒體檔案類中查詢,至于ContentResolver內容決議類的原理和使用方式,將在后面關于應用級檔案共享的文章中詳細講解,
目標版本級別不小于30的應用程式
在Android11及API 30及以上的系統中,強制開啟了磁區存盤,應用只能訪問其應用級檔案和媒體檔案,同時新增了管理外部存盤的權限android.Manifest.permission.MANAGE_EXTERNAL_STORAGE,與上文的外部存盤的讀寫權限共同授權,允許當前應用程式訪問外部存盤的所有檔案,
而訪問外部存盤的方式同樣是使用Environment環境類的getStorageDirectory()系列靜態方法獲取外部存盤中的相關File檔案,
應用級檔案
所謂應用級檔案,就是該檔案只運行其所屬的應用程式讀寫訪問,只能由該應用程式創建,且隨著應用程式的卸載或清除資料而洗掉,
在沒有開啟磁區存盤之前,即Android 10系統版本之前,應用級檔案不僅可以保存在內部存盤中,也可以保存在外部存盤中,且由于應用程式之間對外部存盤的訪問并未受到限制,所以外部存盤部分的應用級檔案往往可以被不同應用程式訪問,
而自Android 10啟用磁區存盤之后,應用程式的應用級檔案只能保存在內部存盤中,即便在Android 11系統之后恢復了應用程式對外部存盤的訪問授權,也不會在外部存盤中創建應用級檔案,
訪問應用級檔案的方式是通過背景關系環境類
android.content.Context物件,
呼叫Context物件的getDir(String name, int mode)方法可以獲取指定目錄下的私有檔案,回傳File檔案型別的物件,通常路徑為 /data/data/應用包名/app_name/name,其中引數 name 是指定的檔案名;引數 mode 是對該檔案的操作模式,通常為Context.MODE_PRIVATE=0表示檔案私有,或者Context.MODE_APPEND為寫入檔案的追加模式,
呼叫Context物件的getCacheDir()方法可以獲取當前應用程式下的快取檔案目錄,回傳File檔案型別的物件,通常路徑為 /data/data/應用包名/cache/,
呼叫Context物件的getFilesDir()方法可以獲取當前應用程式下的特定檔案目錄,回傳File檔案型別的物件,通常路徑為 /data/data/應用包名/files/,
還有其他相關方法,可以獲取當前應用程式下的某些指定檔案目錄,不再贅述,
對于應用程式下的應用級檔案通常是不允許其他應用訪問的,可如果某些應用級檔案的確想被其他應用程式所訪問,比如某個通訊類應用程式需要訪問通訊錄應用中的聯系人資訊,有什么好的辦法呢?敬請關注下一章了解詳情,
———————————————————————————————轉載請注明出處:白少木丿—————————————————轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/301200.html
標籤:其他
上一篇:iOS之多語言開發
