最長用到的就這三個位置
- /data/data/包名/
- /sdcard/Android/data/包名/
- /sdcard/xxx
前兩個是應用內部存儲, 會隨着app的卸載而自動刪除, sdcard中其他的文件夾不會自動刪除, 除非用戶手動刪除, 否則會一直存在, 換句話說就是垃圾.
Google官方建議把數據存儲在 /sdcard/Android/data/包名/ 下.
路徑獲取方法
前兩個應用內部存儲通過 Context 來獲取, 第三個作為外部存儲是通過 Environment 類來獲取. 注釋為返回值.
/data/data/包名/
context.getFilesDir(); // /data/data/包名/files
context.getCacheDir(); // /data/data/包名/cache
/sdcard/Android/data/包名/
context.getExternalFilesDir(); // /sdcard/Android/data/包名/files
context.getExternalCacheDir(); // /sdcard/Android/data/包名/cache
/sdcard/xxx
// /storage/emulated/0
Environment.getExternalStorageDirectory();
// /storage/emulated/0/DCIM, 另外還有MOVIE/MUSIC等很多種標准路徑
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
注意, 根據源碼文檔中說明, 獲取外部存儲時, 有可能會因為各種問題導致獲取失敗, 建議先使用 getExternalStorageState 來判斷外部存儲狀態, 如果已掛載的話再存儲.
在開發過程中,我們會經常需要操作手機的sd卡,在使用前,我們應該先判斷sd卡的狀態再使用
通過Environment.getExternalStorageState()方法我們可以獲得sd卡的狀態信息
返回的是一個string類型的狀態量。
狀態的參數用法如下
sd卡狀態 | 現象描述 | /mnt/sdcard目錄存在否 | canWrite()返回 | canRead()返回 | 在/mnt/sdcard創建文件 | 在/mnt/sdcard創建文件夾 |
MEDIA_MOUNTED | SD卡正常掛載 | 是 | true | true | 可 | 可 |
MEDIA_REMOVED | sd卡不存在 | 是 | false | false | 不可 | 不可 |
MEDIA_UNMOUNTED | sd卡存在,系統未掛載 | 是 | false | false | 不可 | 不可 |
MEDIA_BAD_REMOVAL | sd卡在被掛載前,被暴力直接移除 |
|
false | false | 不可 | 不可 |
MEDIA_SHARED | 存在sd卡,但未被掛載處於被通過usb共享內存狀態中 | 是 | false | false | 不可 | 不可 |
MEDIA_CHECKING | sd卡處於被檢查狀態 | 是 | false | false | 不可 | 不可 |
MEDIA_MOUNTED_READ_ONLY | sd卡為只讀狀態 | 是 | false | true | 不可 | 不可 |
MEDIA_NOFS | 1、sd卡存在為空白狀態2、系統不支持 | 是 | false | false | 不可 | 不可 |
MEDIA_UNMOUNTABLE | sd卡不能掛載 | 是 | false | false | 不可 | 不可 |
所需權限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>