網站首頁 編程語言 正文
存儲的可選項
Android 的文件系統類似于其他平臺的基于磁盤的文件系統。包括以下幾種存儲類別:
- App 私有的存儲空間
- 共享的存儲空間
- Preferences,以 key-value 的形式存儲一些原始的內容,如 SharedPreferences。
- 數據庫
不同的存儲類別扮演了不同的角色,比如 App 的私有存儲空間是無法被外部訪問的,可以用來存儲一些 App 私有的敏感信息;共享的存儲空間可以存儲一些所有應用都可以訪問的文件,例如媒體、文檔等可公開的文件;數據庫則是用來處理持久化的;Preferences 用來存儲一些本地字段。
存儲位置的劃分
Android 系統的文件存儲位置劃分為兩大類:內部存儲空間和外部存儲空間?,其中,外部存儲空間又包括 App 私有目錄和公共目錄。
在大多數設備上,內部存儲空間是小于外部的,但是內部存儲空間是始終可以使用的,與之相反,一些可以插 SD 卡的設備的外部存儲空間是可以拓展的,所以意味著 SD 卡這部分存儲空間不是始終可用的。
內部存儲空間
內部存儲空間是 App 私有的存儲數據的存儲空間,系統會阻止其他應用對這部分數據的訪問,并且在 Android 10(API 級別 29)及更高版本中,系統會對這些位置進行加密。 內部存儲空間的特性讓它很適合存儲只有 App 本身才能訪問的敏感數據。
內部存儲空間可以通過Context.getFileDir()
或Context.getCacheDir()
獲取到,主要路徑是:
Context.getFileDir() 獲取的路徑為: - data/data/packagename/files (部分手機廠商) - data/user/0/packagename/files (部分手機廠商) Context.getCacheDir() 獲取的路徑為: - data/data/packagename/cache (部分手機廠商) - data/user/0/packagename/cache (部分手機廠商)
外部存儲空間
外部存儲空間包括 App 私有目錄和公共目錄。
- App 私有目錄: App 的私有目錄指其他應用可以訪問當前應用該目錄下的數據,應用卸載后也會隨之刪除。
- 公共目錄:外部可以自由訪問,應用刪除后這部分存儲的數據不會刪除。
App 私有目錄
// 可以通過以下函數獲取 Context.externalCacheDir Context.externalCacheDirs Context.getExternalFilesDir(String) Context.getExternalFilesDirs(String) Context.externalMediaDirs
對應的目錄是:
externalCacheDir: /storage/emulated/0/Android/data/com.chunyu.workdemo/cache externalCacheDirs: /storage/emulated/0/Android/data/com.chunyu.workdemo/cache ExternalFilesDir: /storage/emulated/0/Android/data/com.chunyu.workdemo/files ExternalFilesDirs: /storage/emulated/0/Android/data/com.chunyu.workdemo/files externalMediaDirs: /storage/emulated/0/Android/media/com.chunyu.workdemo
這里的com.chunyu.workdemo
是 packageName。
外部公共目錄
不要被這里的“外部”這個詞弄糊涂了。最好將此目錄視為媒體/共享的存儲部分。它是一個文件系統,可以保存相對大量的數據,并且在所有應用程序之間共享(不強制執行權限)。傳統上這是一張 SD 卡,但它也可以作為設備中的內置存儲實現,與受保護的內部存儲不同,并且可以作為文件系統安裝在計算機上。
在具有多個用戶的設備上(如 UserManager 所述),每個用戶都有自己的隔離共享存儲。應用程序只能訪問它們正在運行的用戶的共享存儲。
獲取方式:
Environment.getExternalStorageState() // SD 卡狀態 Environment.getExternalStorageDirectory() Environment.getExternalStoragePublicDirectory(String)
輸出內容:
getExternalStorageState: mounted // 已掛載
getExternalStorageDirectory: /storage/emulated/0?
getExternalStoragePublicDirectory: /storage/emulated/0
getExternalStorageDirectory
和getExternalStoragePublicDirectory
已經被標記為棄用,可以使用Context.getExternalFilesDir(String)
、MediaStore 或Intent.ACTION_OPEN_DOCUMENT
等替代方案,它們性能更好。
在上述的需要傳遞 String 參數的方法中,例如Context.getExternalFilesDir(String)
和getExternalStoragePublicDirectory(String)
,String 有以下幾個常量值:
> DIRECTORY_MUSIC // 音樂 > DIRECTORY_PODCASTS // 博客 > DIRECTORY_RINGTONES // 鈴聲 > DIRECTORY_ALARMS // 鬧鐘 > DIRECTORY_NOTIFICATIONS // 通知 > DIRECTORY_PICTURES // 圖片 > DIRECTORY_MOVIES // 電影 > DIRECTORY_DOWNLOADS // 下載 > DIRECTORY_DCIM // 照片 > DIRECTORY_DOCUMENTS // 文檔
不能傳遞空值。
系統目錄
Environment 還提供了對一些系統目錄的訪問方法:
Environment.getRootDirectory() // 系統分區的 root 路徑 Environment.getDataDirectory() // 獲取用戶數據目錄的路徑 Environment.getDownloadCacheDirectory() // 獲取用戶緩存目錄的路徑 // 輸出為 getRootDirectory: /system getDataDirectory: /data getDownloadCacheDirectory: /data/cache
清除數據和清除緩存
在 App 中,從上面的方法名中我們也能體會到 cache 和 file 兩種路徑,應該有不同的作用。
清除數據
清除數據清除的是保存在app中所有數據,就是上面提到的位于 packageName 下面的所有文件,包含內部存儲/data/data/packagename/
和外部存儲?/storage/emulated/0/Android/data/packagename/
。
清除緩存
緩存是程序運行時的臨時存儲空間,它可以存放從網絡下載的臨時圖片,從用戶的角度出發清除緩存對用戶并沒有太大的影響,但是清除緩存后用戶再次使用該APP時,由于本地緩存已經被清理,所有的數據需要重新從網絡上獲取。為了在清除緩存的時候能夠正常清除與應用相關的緩存,請將緩存文件存放在getCacheDir()
或者getExternalCacheDir()
路徑下。
數據管理權限
某些應用的使用場景時需要廣泛訪問設備上的文件,但無法采用注重隱私保護的存儲最佳做法高效地完成這些操作。對于這些情況,Android 提供了一種名為“所有文件訪問權限”的特殊應用訪問權限。 例如,防病毒應用的主要場景可能是需要定期掃描不同目錄中的許多文件。如果此掃描需要反復的用戶交互,讓用戶使用系統文件選擇器選擇目錄,可能就會帶來糟糕的用戶體驗。其他場景(如文件管理器應用、備份和恢復應用以及文檔管理應用)可能也需要考慮類似情況。
應用可以通過執行以下操作向用戶請求“所有文件訪問權限”:
- 在清單中聲明
MANAGE_EXTERNAL_STORAGE
權限。 - 使用
ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
設置 Intent ,將用戶引導至一個系統設置頁面,在該頁面上,用戶可以為您的應用啟用以下選項:授予所有文件的管理權限。可以通過Environment.isExternalStorageManager()
方法來檢查是否已獲得這個權限。
MANAGE_EXTERNAL_STORAGE
會授予以下權限:
- 對公共目錄中所有文件的讀寫權限。
- 對
MediaStore.Files
表的內容的訪問權限。 - 除
/Android/data/
、/sdcard/Android
和/sdcard/Android
?大多數子目錄外,對所有內部存儲目錄?的寫入權限。
獲得此權限的應用仍然無法訪問屬于其他應用的內部存儲空間,因為這些目錄在存儲卷上顯示為 Android/data/ 的子目錄。
原文鏈接:https://juejin.cn/post/7091691466119970852
相關推薦
- 2022-10-06 使用pip下載時提示"You?are?using?pip?version?8.1.1,?howeve
- 2021-12-11 C語言SetConsoleCursorPosition函數使用方法_C 語言
- 2022-07-16 Spring MVC @ModelAttribute注解
- 2022-07-18 RabbitMQ隊列阻塞該如何處理
- 2023-01-31 C#實現偽裝文件夾功能_C#教程
- 2022-05-11 生產事故記錄(tomcat線程池與數據庫連接池)與(堆棧信息)Jprofile的使用
- 2022-05-09 Python的數據結構與算法的隊列詳解(3)_python
- 2022-09-07 Golang?range?slice?與range?array?之間的區別_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支