天天看點

Android 應用目錄分析沙箱私有目錄外部存儲空間中的應用私有目錄外部存儲公有目錄

轉載請标明出處: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

:機身記憶體不足時,檔案會被删除

Android 應用目錄分析沙箱私有目錄外部存儲空間中的應用私有目錄外部存儲公有目錄

需要注意的是,

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
)