一、總結
路徑取得方法 | APP專用 | 非root用戶可見 | APP卸載時 | |
---|---|---|---|---|
內部數據空間 | Context.getFilesDir() | yes | no | 消失 |
內部緩存空間 | Context.getCacheDir() | yes | no | 消失 |
外部數據空間 | Context.getExternalFilesDir() | yes | yes | 消失 |
外部緩存空間 | Context.getExternalCacheDir() | yes | yes | 消失 |
外部公開空間 | Environment.getExternalStorageDirectory() | no | yes | 不消失 |
外部公開共享空間 | Environment.getExternalStoragePublicDirectory() | no | yes | 不消失 |
內部空間 只有APP自己可以訪問,其他APP和手機用戶都不可以見。卸載消失。
外部空間 APP自己,手機用戶,其他授權APP可以訪問。卸載消失
公開空間,所有APP都可以訪問。卸載不消失。
測試
Context.getFilesDir() :/data/data/com.example/files
Context.getCacheDir() :/data/data/com.example/cache
Context.getExternalCacheDir() :/storage/emulated/0/Android/data/com.example/cache
Context.getExternalFilesDir() :/storage/emulated/0/Android/data/com.example/files
Environment.getExternalStorageDirectory() :/storage/emulated/0
Environment.getExternalStoragePublicDirectory() :/storage/emulated/0/
1.內部存儲空間中的應用私有目錄
路徑取得方法 | APP專用 | 非root用戶可見 | APP卸載時 | |
---|---|---|---|---|
內部數據空間 | Context.getFilesDir() | yes | no | 消失 |
內部緩存空間 | Context.getCacheDir() | yes | no | 消失 |
對於設備中每一個安裝的 App,系統都會在內部存儲空間的 data/data 目錄下以應用包名爲名字自動創建與之對應的文件夾。這個文件夾用於 App 中的 WebView 緩存頁面信息,SharedPreferences 和 SQLiteDatabase 持久化應用相關數據等。
對於沒有 Root 過的手機,普通用戶是無法查看 data/data 目錄內容的。不過開發人員可以使用模擬器調試應用,並通過 DDMS(Dalvik Debug Monitor Server)提供的 File Explorer 工具查看模擬器設備的存儲空間。
當用戶卸載 App 時,系統自動刪除 data/data 目錄下對應包名的文件夾及其內容。
2.外部存儲空間中的應用私有目錄
路徑取得方法 | APP專用 | 非root用戶可見 | APP卸載時 | |
---|---|---|---|---|
外部數據空間 | Context.getExternalFilesDir() | yes | yes | 消失 |
外部緩存空間 | Context.getExternalCacheDir() | yes | yes | 消失 |
考慮內部存儲空間容量有限,普通用戶不能直接直觀地查看目錄文件等其他原因,Android 在外部存儲空間中也提供有特殊目錄供應用存放私有文件,文件路徑爲:
/storage/emulated/0/Android/data/app包名目錄
值得注意的是,與內部存儲空間的應用私有目錄不同的是:
第一,默認情況下,系統並不會自動創建外部存儲空間的應用私有目錄。只有在應用需要的時候,開發人員通過 SDK 提供的 API 創建該目錄文件夾和操作文件夾內容。
第二,自 Android 7.0 開始,系統對應用私有目錄的訪問權限進一步限制。其他 App 無法通過 file:// 這種形式的 Uri 直接讀寫該目錄下的文件內容,而是通過 FileProvider 訪問。
而相同點在於:同屬於應用私有目錄,當用戶卸載 App 時,系統也會自動刪除外部存儲空間下的對應 App 私有目錄文件夾及其內容。
值得注意的一點是,對於外部存儲空間下的應用私有目錄文件,由於普通用戶可以自由修改和刪除,開發人員在使用時,一定要做好判空處理和異常捕獲,防止應用崩潰退出!
3.外部存儲空間中的公共目錄
路徑取得方法 | APP專用 | 非root用戶可見 | APP卸載時 | |
---|---|---|---|---|
外部公開空間 | Environment.getExternalStorageDirectory() | no | yes | 不消失 |
外部公開共享空間 | Environment.getExternalStoragePublicDirectory() | no | yes | 不消失 |
從訪問權限上來說,應用無關數據應該是宿主應用希望與其他應用共享這些數據的,應該存放在外部存儲空間的公共目錄文件夾下。
外部存儲空間已經爲用戶默認分類出一些公共目錄。開發人員可以通過 Environment 類提供的方法直接獲取相應目錄的絕對路徑,傳遞不同的 type 參數類型即可:
Environment.getExternalStoragePublicDirectory(String type);
Envinonment 類提供諸多 type 參數的常量,比如:
- DIRECTORY_MUSIC:/storage/emulated/0/Music
- DIRECTORY_MOVIES:/storage/emulated/0/Movie
- DIRECTORY_PICTURES:/storage/emulated/0/Pictures
- DIRECTORY_DOWNLOADS: /storage/emulated/0/Download
- DIRECTORY_DOCUMENTS: /storage/emulated/0/Documents
還可以在外部存儲空間自由創建其他目錄,通過這個方式獲取外部存儲空間的絕對路徑,然後操作文件:
Environment.getExternalStorageDirectory();