轉載請标明出處:http://blog.csdn.net/zhaoyanjun6/article/details/119650111
本文出自【趙彥軍的部落格】
文章目錄
- 沙箱私有目錄
- 外部存儲空間中的應用私有目錄
- 外部存儲公有目錄
沙箱私有目錄
- 内部存儲空間中的應用私有目錄
val filesDir = filesDir
/data/user/0/com.example.myapplication/files
val cacheDir = cacheDir
/data/user/0/com.example.myapplication/cache
是
app
的私有目錄,也稱沙箱。
App
解除安裝後,此目錄随之删除。檔案管理器無法通路,除非
root
。還有一種方法,把手機連到到電腦上,運作
app debug
模式,用
AndroidStudio
工具是可以看到的。
cacheDir
:機身記憶體不足時,檔案會被删除
需要注意的是,
app
的
SharedPreferences
和
SQLiteDatabase
持久化應用相關資料也在這個目錄的父目錄。
SharedPreferences: /data/user/0/app_package_name/shared_prefs
SQLiteDatabase: /data/user/0/app_package_name/databases
Context
提供了一個簡便方式,來擷取一個内部私有目錄
//擷取一個私有目錄,如果沒有,系統自動建立
val dir = getDir("myFile", Context.MODE_PRIVATE)
/data/user/0/app_package_name/myFile
- mode 是指檔案夾的通路權限而并不包括其子檔案夾和檔案的通路權限:
- MODE_PRIVATE :該檔案隻能被目前程式讀寫;
- MODE_APPEND : 以追加方式打開該檔案,應用程式可以向該檔案中追加内容。
- MODE_WORLD_READABLE :該檔案的内容可以 被其他程式讀取。
- MODE_WORLD_WRITEABLE :該檔案的内容可以 被其他程式讀取、寫入。
外部存儲空間中的應用私有目錄
val externalCacheDir = externalCacheDir?.absolutePath
/storage/emulated/0/Android/data/app_package_name/cache
val filesDir = getExternalFilesDir(null) //null 代表根目錄
/storage/emulated/0/Android/data/app_package_name/files
這個目錄,是沙箱目錄,App 解除安裝後,此目錄随之删除 ,這個目錄可以通過檔案管理器通路。有一點是特别需要注意的,這個目錄存儲在 SD 卡上,如果使用者把 SD 卡解除安裝了,那麼這個目錄将不可用。
内部私有目錄、外部私有目錄 均不需要申請權限。
值得注意的是,與内部存儲空間的應用私有目錄不同的是:
- 第一,預設情況下,系統并不會自動建立外部存儲空間的應用私有目錄。隻有在應用需要的時候,開發人員通過 SDK 提供的 API 建立該目錄檔案夾和操作檔案夾内容。
- 第二,自 Android 7.0 開始,系統對應用私有目錄的通路權限進一步限制。其他 App 無法通過 file:// 這種形式的 Uri 直接讀寫該目錄下的檔案内容,而是通過 FileProvider 通路。
- 第三,宿主 App 可以直接讀寫内部存儲空間中的應用私有目錄;而在 4.4 版本開始,宿主 App 才可以直接讀寫外部存儲空間中的應用私有目錄,使開發人員無需在 Manifest 檔案中或者動态申請外部存儲空間的檔案讀寫權限。
- 而相同點在于:同屬于應用私有目錄,當使用者解除安裝 App 時,系統也會自動删除外部存儲空間下的對應 App 私有目錄檔案夾及其内容。
//判斷SD卡是否可用:
val state = EnvironmentCompat.getStorageState(file)
if (state == Environment.MEDIA_MOUNTED) {
//sd卡可用
}
外部存儲公有目錄
val dataDir = Environment.getDataDirectory().absolutePath
/data
val storageDir = Environment.getStorageDirectory().absolutePath
/storage
需要注意的是:這兩個目錄需要權限聲明 , 在 6.0 及以上還需要動态申請權限
如果沒有權限,app 會崩潰
//動态申請權限:
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
),
200
)